将 Core Data 相关代码迁移到 Swift 2
Migrating Core Data related code to Swift 2
我有一些这样的功能:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName:"MyEntity")
var error: NSError?
let fetchedResults = context.executeFetchRequest(fetchRequest) as! [MyEntity]?
if let results = fetchedResults {
return results
}
else {
print("Could not fetch \(error), \(error!.userInfo)")
}
}
return nil
}
现在升级到 Swift 2
和 Xcode 7
,我收到如下错误:
Cannot downcast from '[AnyObject]' to a more optional type '[MyEntity]?'
Call can throw, but it is not marked with 'try' and the error is not handled
这是在执行了自动 Swift
代码迁移之后,您在首次启动 Xcode 7
时会被要求执行此操作。在新 Swift
版本中重写我的函数的正确方法是什么?
谢谢
编辑: 我需要保持与 iOS 7
和 iOS 8
.
的向后兼容性
对于第一个错误,我通常会从 Xcode 那里得到建议,通常是要求我去掉 ?或将其更改为!,我无法为您提供具体的解决方案。
这是解决第二个错误的代码:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName:"MyEntity")
var error: NSError?
let fetchedResults = try context.executeFetchRequest(fetchRequest) as! [MyEntity]?
do {
return results
}
catch error {
print("Could not fetch \(error), \(error!.userInfo)")
}
return nil
}
有两个错误:
- 在Swift2中,
executeFetchRequest()
return是一个非可选的。所以您不能将 return 值转换为 [MyEntity]?
。您可以(强制或可选)将其转换为 [MyEntity]
.
executeFetchRequest()
在错误情况下会抛出错误,所以它必须
在 do-catch
语句中用 try
调用。
示例:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
do {
let results = try context.executeFetchRequest(fetchRequest) as! [MyEntity]
return results
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
return nil
}
}
强制转换 as! [MyEntity]
在这里是可以接受的(就像你的
原始代码)因为你知道实体的class,它是
在核心数据模型检查器中设置。
我有一些这样的功能:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName:"MyEntity")
var error: NSError?
let fetchedResults = context.executeFetchRequest(fetchRequest) as! [MyEntity]?
if let results = fetchedResults {
return results
}
else {
print("Could not fetch \(error), \(error!.userInfo)")
}
}
return nil
}
现在升级到 Swift 2
和 Xcode 7
,我收到如下错误:
Cannot downcast from '[AnyObject]' to a more optional type '[MyEntity]?'
Call can throw, but it is not marked with 'try' and the error is not handled
这是在执行了自动 Swift
代码迁移之后,您在首次启动 Xcode 7
时会被要求执行此操作。在新 Swift
版本中重写我的函数的正确方法是什么?
谢谢
编辑: 我需要保持与 iOS 7
和 iOS 8
.
对于第一个错误,我通常会从 Xcode 那里得到建议,通常是要求我去掉 ?或将其更改为!,我无法为您提供具体的解决方案。
这是解决第二个错误的代码:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName:"MyEntity")
var error: NSError?
let fetchedResults = try context.executeFetchRequest(fetchRequest) as! [MyEntity]?
do {
return results
}
catch error {
print("Could not fetch \(error), \(error!.userInfo)")
}
return nil
}
有两个错误:
- 在Swift2中,
executeFetchRequest()
return是一个非可选的。所以您不能将 return 值转换为[MyEntity]?
。您可以(强制或可选)将其转换为[MyEntity]
. executeFetchRequest()
在错误情况下会抛出错误,所以它必须 在do-catch
语句中用try
调用。
示例:
func getAllEntities() -> [MyEntity]? {
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
do {
let results = try context.executeFetchRequest(fetchRequest) as! [MyEntity]
return results
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
return nil
}
}
强制转换 as! [MyEntity]
在这里是可以接受的(就像你的
原始代码)因为你知道实体的class,它是
在核心数据模型检查器中设置。