【问题标题】:Using Restkit with Swift在 Swift 中使用 Restkit
【发布时间】:2015-04-27 06:41:35
【问题描述】:

我正在尝试在基于 Swift 的项目中使用 RestKit。 我似乎无法使用 Swift 原始数据类型,如 Int、Double、Bool 等,但 String、Array 和 Dictionaries 除外(这可能是因为它们是免费桥接到 NSString 的, NSArray 和 NSDictionary)

使用objective-c,我可以将对象中的属性定义为原始数据类型作为属性,这些属性是被分配的。在 Swift 中,我只能使用对象(String、NSNumber、Array、Dictionary),否则应用程序会因“setValue:forUndefinedKey: this class is not key value coding-compliant for 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?

}

这会崩溃,虽然我确实理解它为什么会崩溃,但我想知道,是否有另一种解决方法,而不是使用 NSNumber 处理布尔值、整数和浮点数,就像它在 Objective-C 中的工作方式一样?

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

【问题讨论】:

  • 您应该显示完整的异常消息和堆栈跟踪。这也可以作为 github 上的一个问题更好地提出。

标签: swift restkit


【解决方案1】:

对于无法在 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"
        }
    }
}

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我正在用 Swift 开发一个应用程序,我们在 2014 年夏天开始工作,当时 Swift 还很新。我开始使用 RestKit 来处理与服务器的 REST 通信,并且我至少花了整整一个月的时间来配置 RestKit 以供我使用。

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

    如果这对您来说不可行,您可能想看看 RestKit 中可用的 RKValueTransformer 类;在您的 RKObjectMapping 中,您可以为各个属性指定自己的转换器。但同样,我认为最好把时间花在 Alamofire 和 SwiftyJSON 上。毕竟,它们是原生 Swift 库。

    【讨论】:

    • 感谢鼓励
    • 感谢您鼓励我放弃 RestKit 来完成这个快速的项目。尽管 SwiftyJSON 不是 RestKit 的完全替代品,但 RestKit 的工作方式可能不是我们想要在 Swift 中解决问题的方式。如果我们现在尝试从 Objective-C 将所有内容从 1 到 1 “翻译”,这有点违背了引入全新语言的目的。相反,我们应该尝试接受新的范式。 Alamofire (Mattt Thompson) 令人印象深刻地表明,要走的路是在 Swift 中从头开始创建新框架,而不是更新相应的 Obj-C 框架 (AFNetworking)。
    • 嗨@alex,很高兴这令人鼓舞:-)我同意你的看法。
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2015-03-18
    相关资源
    最近更新 更多