使用Swift与Restkit

7
我正在尝试在我的基于Swift的项目中使用RestKit。似乎我无法使用Swift原始数据类型,例如Int、Double、Bool等,除了String、Array和Dictionary(这可能是因为它们与NSString、NSArray和NSDictionary之间存在桥接)。
在Objective-C中,我可以将我的对象属性定义为原始数据类型,并进行分配。但在Swift中,我只能使用对象(String、NSNumber、Array、Dictionary),否则应用程序会崩溃并显示“setValue:forUndefinedKey:this class is not key value coding-compliant for the key 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?

}

这个程序崩溃了,虽然我知道为什么它会崩溃,但我还是想知道是否有其他方法来解决问题,而不是像在Objective-C中使用NSNumber来处理布尔值、整数和浮点数一样的方法?

(如果RestKit的开发人员中有任何人阅读此内容:首先感谢你们的工作,然后:是否有关于支持Swift或将其移植到Swift的计划?)


你应该显示完整的异常信息和堆栈跟踪。这也可以在 Github 上作为一个更好的问题提出。 - Wain
2个回答

8

我正在使用Swift开发一个应用程序,我们开始于2014年夏季,当时Swift还很新。我开始使用RestKit处理与服务器的REST通信,并花费了至少一个月的时间来配置RestKit以适应我的需求。

虽然我不知道你的用例,但我发现使用Alamofire和SwiftyJSON更容易完成这项工作。它节省了我大量的时间。这也意味着我手动将动态类型转换为实体对象中的类型,但花费的时间远少于我之前尝试配置RestKit所花费的时间。

如果这对你来说不可行,你可以查看RestKit中可用的RKValueTransformer类;在你的RKObjectMapping中,你可以为单个属性指定自己的转换器。但是,我认为与Alamofire和SwiftyJSON一起使用的时间更好。毕竟它们是本地的Swift库。


感谢您的鼓励。 - alex da franca
1
感谢你鼓励我在这个 Swift 项目中放弃 RestKit。虽然 SwiftyJSON 不是 RestKit 的完全替代品,但 RestKit 的工作方式可能不是我们想要在 Swift 中解决问题的方式。如果我们现在尝试从 Objective-C 逐字逐句地“翻译”一切,那么这有点违背引入全新语言的目的。相反,我们应该尝试拥抱新的范式。Alamofire(Mattt Thompson)令人印象深刻地展示了,正确的方法是在 Swift 中从头开始创建新的框架,而不是更新相应的 Obj-C 框架(AFNetworking)。 - alex da franca
嗨@alex,很高兴它能够鼓舞你:-) 我同意你的看法。 - Joachim Bøggild

2
对于那些在Swift项目中无法放弃RestKit的人,这个解决方案可能会有所帮助。
在我的情况下,应用程序崩溃是因为RestKit无法将JSON中的“true” / “false”字符串映射到Swift中的Bool类型。
我添加了另一个String属性到我的类中,并在其didSet方法中更新所需的布尔值。在你的情况下,可以这样做:
@objc class TestObject:NSObject {

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

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

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接