2015-02-25 3 views
5

Я пытаюсь использовать RestKit в моем проекте, основанном на Swift. Я, похоже, не могу использовать примитивные типы данных Swift, такие как Int, Double, Bool и т. Д., За исключением String, Array и Dictionaries (что, по-видимому, связано с тем, что они беспошлинно подключены к NSString , NSArray и NSDictionary)Использование Restkit with Swift

С объективом c я мог бы определить свойства в моих объектах как примитивные типы данных как назначаемые свойства. В Swift я могу использовать только объекты (String, NSNumber, Array, Dictionary), иначе приложение выйдет из строя с помощью «setValue: forUndefinedKey: этот класс не подходит для кодирования ключа для ключа aBool».

Пример: Вот как мой объект будет выглядеть в Objective-C:

@interface TestObject : NSObject 

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

@end 

и "эквивалент" в Swift:

class TestObject:NSObject { 

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

} 

Это происходит сбой, и в то время как я понимаю, почему это сбои, я хотел бы знать, есть ли другое обходное решение, чем использование NSNumber для Booleans, Integer и Floats, так же, как это работает в Objective-C?

(Если какой-либо из разработчиков RestKit читают это: Прежде всего спасибо за вашу работу, а затем: Существуют ли какие-либо планы в отношении Swift поддержки/порт для Swift)

+0

Вы должны показывать полные сообщения об исключениях и трассировки стека. Это также может быть лучше поднято как проблема на github. – Wain

ответ

8

Я делаю приложение в Swift, и мы начали работать летом 2014 года, когда Свифт был совершенно новым. Я начал использовать RestKit для обработки связи REST с сервером, и я провел как минимум полный месяц с настройкой RestKit для моего использования.

Хотя я не знаю вашего прецедента, я нашел проще использовать Alamofire и SwiftyJSON для работы. Это спасло мне много часов. Это также означает, что я вручную делаю преобразование из динамических типов в типы объектов объекта, но время, потраченное на это, намного меньше времени, которое я ранее потратил на настройку RestKit.

Если это нежизнеспособный способ для вас, вы можете захотеть взглянуть на классы RKValueTransformer, доступные в RestKit; в вашем RKObjectMapping вы можете указать собственные трансформаторы для отдельных свойств. Но опять же, я думаю, что время лучше потрачено на Alamofire и SwiftyJSON. В конце концов, это родные библиотеки Swift.

+0

Спасибо за поощрение –

+1

Спасибо, что побудили меня отказаться от RestKit для этого быстрого проекта. Хотя SwiftyJSON не является точной заменой RestKit, то, как работает RestKit, возможно, не так, как мы хотим решить наши проблемы в Swift.Это как бы поражает цель введения всего нового языка, если мы теперь попытаемся «перевести» все от 1 до 1 из Objective-C. Скорее, мы должны попытаться охватить новые парадигмы. Аламофир (Mattt Thompson) демонстрирует впечатляюще, что путь - это создать новые рамки с нуля в Swift, а не обновлять соответствующие рамки Obj-C (AFNetworking). –

+0

Привет, @alex, рад, что это было обнадеживающим :-) Я согласен с тобой. –

0

Для тех, кто не может отказаться от RestKit в проекте Swift, это решение может быть полезно.

В моем случае приложение было сбой, потому что RestKit не может отобразить "true"/"false" строки из JSON в Bool типа в Swift.

Я решил добавить еще один атрибут String в мой класс и обновить требуемое логическое значение в его методе didSet. В вашем случае это будет:

class TestObject:NSObject { 

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

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

Надеюсь, что это поможет!

Смежные вопросы