2015-10-08 40 views
6

Tôi rất mới đối với iOS, di chuyển từ phát triển Android.Nối tiếp lớp Swift thành JSON bằng cách sử dụng thư viện J2ObjC và GSON

Chúng tôi có một ứng dụng Android trong đó có một số thư viện mà chúng tôi đang sử dụng J2ObjC để dịch sang Objective C.

Tôi đã từng bước đưa trên các thư viện và cho đến nay, như vậy tốt.

Tuy nhiên, sau khi dịch thư viện GSON của Google Tôi có một vấn đề mà nếu tôi cố gắng và sử dụng phương pháp dịch toJsonWithId tôi đi qua các vấn đề:

let gson = ComGoogleGsonGson() 
    let swiftTest = GsonSwiftTest() 
    swiftTest.name = "Ricky" 
    print(gson.toJsonWithId(swiftTest)) 

tôi nhận được lỗi sau:

libc++abi.dylib: terminating with uncaught exception of type JavaLangAssertionError

Hơn nữa nó cho thấy:

Terminating app due to uncaught exception 'JavaLangAssertionError', reason: 'unknown Java type encoding'

Lớp Swift của tôi là:

import Foundation 

@objc 
public class GsonSwiftTest : NSObject { 

    var name:String? 

} 

Nếu tôi thay vì sử dụng lớp C mục tiêu trong dự án Swift, hãy thêm nó vào tiêu đề cầu nối và sử dụng lớp Objective C hoạt động tốt.

Tôi tin rằng đây là một sự hiểu lầm về phía tôi, nhưng tôi không thể tìm thấy câu trả lời là tại sao điều này sẽ không hoạt động. Kiểm tra mã nguồn J2ObjC cho thấy lỗi được nêu ra khi loại của lớp không thể được tìm thấy.

Nếu có ai đó có thể giúp giải thích lý do cho vấn đề này, nó sẽ được đánh giá cao.

Cảm ơn!

Trả lời

4

Có một cách dễ dàng hơn để tuần tự hóa các cá thể Swift: sử dụng lớp Foundation NSJSONSerialization trực tiếp. Đây là bài đăng trên blog có liên quan: JSON Serialization in Swift.

Lý do kiểm tra của bạn không thành công trong Swift là không phải tất cả các lớp Swift đều mở rộng NSObject, mà j2objc ánh xạ tới java.lang.Object. Tất cả các khung công tác tuần tự hóa Java giả sử/yêu cầu tất cả các lớp mở rộng Object, giống như chúng làm trong Java.

Đối với API đa nền tảng, tôi khuyên bạn nên tạo một giao diện serialize/unserialize đơn giản, sau đó triển khai nó một lần cho Android bằng GSON và một khi sử dụng NSJSONSerialization một lần. Swift đang phát triển nhanh chóng, vì vậy nếu một cơ chế tuần tự hóa tốt hơn có sẵn, dự án của bạn có thể dễ dàng tận dụng nó mà không ảnh hưởng đến cổng Android.

+1

Cảm ơn Tom, tôi đã biết về NSJSONSerialization, tôi chỉ muốn hiểu lý do cho sự thất bại mà bạn đã giải thích. Cảm ơn bạn đã làm việc chăm chỉ trên thư viện. – Ricky

Các vấn đề liên quan