【问题标题】:NSFetchRequest Core Data Swift 3 Backward compatibilityNSFetchRequest 核心数据 Swift 3 向后兼容性
【发布时间】:2017-01-23 01:19:34
【问题描述】:

我已经在 swift 3 中转换了我的代码。我在我的应用程序中使用核心数据。如您所知,NSFetchRequest 已更改。 在 swift 2 中是:

let request = NSFetchRequest(entityName: "UnsyncedTask")

在 Swift 3 中:

let request:NSFetchRequest<NSFetchRequestResult> = UnsyncedTask.fetchRequest()

我的问题是,它只支持 ios 10。我怎样才能让它向后兼容 ios? 我想要支持 ios 9、ios 10 和 swift 3 的 NSFetchRequest。

【问题讨论】:

    标签: ios core-data swift3 nsfetchrequest ios10


    【解决方案1】:

    NSFetchRequest(entityName:) 在 Swift 3 中仍然可用。 您可以使用 if #available 在 iOS 10/macOS 10.12 上使用更新的 API 或更高版本,以及旧操作系统版本上的旧 API:

    let request: NSFetchRequest<UnsyncedTask>
    if #available(iOS 10.0, OSX 10.12, *) {
        request = UnsyncedTask.fetchRequest()
    } else {
        request = NSFetchRequest(entityName: "UnsyncedTask")
    }
    do {
        let results = try context.fetch(request)
        for task in results {
            // ...
        }
    } catch let error {
        print(error.localizedDescription)
    }
    

    【讨论】:

    • 不适合我。我的 iOS 部署目标是 9.2,我在上面的代码中出现错误 request = Settings.fetchRequest()。错误是:Cannot assign value of type 'NSFetchRequest' to type 'NSFetchRequest' The Settings 只是从 xCode 7 中的模型生成的 NSManagedObject
    • @MarcinKapusta:但是您现在使用的是 Xcode 8?我用一个新的 Xcode 8 项目对其进行了测试。
    • @MartinR 是的,我现在正在使用 xCode 8。我需要使用 xCode 8 重新生成我的模型吗?
    • @MarcinKapusta 我强烈这么认为。 Xcode 8 为每个实体创建一个 fetchRequest 方法。
    • @MartinR 对不起,我错了。现在我看到编译器抱怨这个Ambiguous use of 'fetchRequest()'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2015-12-08
    相关资源
    最近更新 更多