2015-02-25 39 views
5

Tôi đang cố gắng sử dụng RestKit trong dự án dựa trên Swift của mình. Tôi dường như không thể sử dụng các kiểu dữ liệu nguyên thủy Swift, như Int, Double, Bool, v.v., ngoại trừ String, Array và Dictionaries (có lẽ là do thực tế, chúng là cầu nối miễn phí tới NSString , NSArray và NSDictionary)Sử dụng Restkit với Swift

Với mục tiêu-c Tôi có thể xác định các thuộc tính trong đối tượng của tôi như là kiểu dữ liệu nguyên thủy như các thuộc tính, được gán. Trong Swift tôi chỉ có thể sử dụng các đối tượng (String, NSNumber, Array, Dictionary), nếu không ứng dụng gặp sự cố với "setValue: forUndefinedKey: lớp này không phải là giá trị mã hóa tuân thủ cho khóa aBool".

Ví dụ: Sau đây là cách đối tượng của tôi sẽ như thế nào trong Objective-C:

@interface TestObject : NSObject 

@property (strong, nonatomic) NSString *aString; 
@property (assign, nonatomic) BOOL aBool; 
@property (assign, nonatomic) CGFloat aFloat; 

@end 

và "tương đương" trong Swift:

class TestObject:NSObject { 

    var aString:NSString? 
    var aBool:Bool? 
    var aFloat:Double? 

} 

Đó tai nạn và trong khi tôi làm hiểu TẠI SAO nó treo, tôi muốn biết, cho dù có một cách giải quyết khác, hơn bằng cách sử dụng NSNumber cho Booleans, số nguyên và nổi, trong cùng một cách nó hoạt động trong mục tiêu-C?

(Nếu bất kỳ của các nhà phát triển RestKit đang đọc này: Trước hết cảm ơn cho công việc của bạn và sau đó: Có bất kỳ kế hoạch liên quan đến Swift hỗ trợ/cổng để Swift)

+0

Bạn nên hiển thị đầy đủ các thông điệp ngoại lệ và đống dấu vết. Điều này cũng có thể được nâng lên tốt hơn như một vấn đề trên github. – Wain

Trả lời

8

Tôi đang làm một ứng dụng trong Swift, và chúng tôi bắt đầu làm việc vào mùa hè năm 2014, khi Swift khá mới. Tôi bắt đầu sử dụng RestKit để xử lý giao tiếp REST với một máy chủ và tôi đã dành ít nhất một tháng với cấu hình RestKit để sử dụng.

Mặc dù tôi không biết trường hợp sử dụng của bạn nhưng tôi thấy dễ dàng hơn khi sử dụng Alamofire và SwiftyJSON cho công việc thay thế. Nó đã giúp tôi tiết kiệm hàng giờ. Nó cũng có nghĩa là tôi đang thực hiện chuyển đổi theo cách thủ công từ các kiểu động sang các kiểu trong đối tượng thực thể của tôi, nhưng thời gian thực hiện điều đó ít hơn nhiều so với thời gian trước đây tôi đã cố gắng định cấu hình RestKit.

Nếu đây không phải là cách hữu hiệu đối với bạn, bạn có thể muốn xem qua các lớp RKValueTransformer có sẵn trong RestKit; trong RKObjectMapping của bạn, bạn có thể chỉ định máy biến áp của riêng bạn cho các thuộc tính cá nhân. Nhưng một lần nữa, tôi nghĩ rằng thời gian tốt hơn là dành cho Alamofire và SwiftyJSON. Họ là những thư viện Swift nguyên bản.

+0

Cảm ơn để khuyến khích –

+1

Cám ơn khích lệ tôi để thả RestKit cho dự án nhanh chóng này. Mặc dù SwiftyJSON không phải là một sự thay thế chính xác cho RestKit, các công trình RestKit bằng cách nào, có thể không phải là cách mà chúng tôi muốn giải quyết vấn đề của chúng tôi trong Swift.Nó đánh bại mục đích giới thiệu một ngôn ngữ mới, nếu bây giờ chúng ta cố gắng "dịch" mọi thứ từ 1 đến 1 từ Objective-C. Thay vào đó chúng ta nên cố gắng nắm lấy các mô hình mới. Alamofire (Mattt Thompson) cho thấy ấn tượng, rằng con đường để đi là tạo các khung công tác mới từ đầu trong Swift, thay vì cập nhật khung công tác Obj-C tương ứng (AFNetworking). –

+0

Xin chào @alex, hạnh phúc vì điều đó đã khích lệ :-) Tôi đồng ý với bạn. –

0

Đối với những ai không thể thả RestKit trong một dự án Swift, giải pháp điều này có thể hữu ích.

Trong trường hợp của tôi, ứng dụng bị lỗi vì RestKit không thể ánh xạ các chuỗi "true"/"false" từ JSON đến loại Bool trong Swift.

Tôi đã giải quyết thêm thuộc tính String khác trong lớp của mình và cập nhật giá trị boolean mong muốn theo phương pháp didSet của nó. Trong trường hợp của bạn, điều này sẽ là:

class TestObject:NSObject { 

    var aString:NSString? 
    var aBool:Bool? 
    var aFloat:Double? 

    var aBoolString: String? { 
     didSet { 
      self.aBool = aBoolString.lowercased() == "true" 
     } 
    } 
} 

Hy vọng điều này sẽ hữu ích!

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