下面的代码突出了我将可选链接和强制转换与Apple的快速语言相结合的问题
import Foundation
import CoreData
class MyExample {
var detailItem: NSManagedObject?
func example() {
//In the actual implementation it is assigned to a UITableViewCell textLabel.text with the same result.
let name: String = self.detailItem?.valueForKey("name") as String
}
}
Run Code Online (Sandbox Code Playgroud)
以上结果如下:
'AnyObject'不能转换为'String'
我能够通过使类变量成为隐式解包的可选项来完成此操作,如下所示:
class MyExample2 {
var detailItem: NSManagedObject!
func example() {
let name: String = self.detailItem.valueForKey("name") as String
}
}
Run Code Online (Sandbox Code Playgroud)
这可行,但现在这个变量并不能反映我的真实世界需要它是可选的
下一个示例也适用于detailItem作为可选:
class MyExample3 {
var detailItem: NSManagedObject?
func example() {
let name: String = self.detailItem?.valueForKey("name").description as String
}
}
Run Code Online (Sandbox Code Playgroud)
上面的问题是我不得不使用描述.使用此功能的输出向用户显示通常不是一个好主意(根据Apple,只是常识)
以上也只能起作用,因为我正在寻找一个字符串.如果我需要一个物体,那就不行了.
作为一个兴趣点,这个例子引发了一个不同的错误:
class MyExample4 {
var detailItem: NSManagedObject?
func example() {
let name: String = self.detailItem?.valueForKey("name")
}
}
Run Code Online (Sandbox Code Playgroud)
以上抛出:
找不到会员'valueForKey'
NSmanagedObject显然有一个valueForKey.
再尝试一件事,我发现了一个潜在的解决方案:
class MyExamplePotentialSolution {
var detailItem: NSManagedObject?
func example() {
let name: NSString = self.detailItem?.valueForKey("name") as NSString
}
}
Run Code Online (Sandbox Code Playgroud)
上面的问题是,它实际分配给UITableViewCell detailTextLabel.text属性时不起作用.
有任何想法吗?
更新的答案
最简单的现实世界使用结果如下:
cell.detailTextLabel.text = self.detailItem?.valueForKey("name") as? NSString
Run Code Online (Sandbox Code Playgroud)
关键是AnyObject不能直接转换为本机swift类型.正如接受的答案所示,它可以从NSString转换为本机Swift字符串.在这种情况下,没有必要.
有两个问题:第一个是在这一行:
let name: String = self.detailItem?.valueForKey("name") as String
Run Code Online (Sandbox Code Playgroud)
右边的部分是可选的(detailItem是可选的),因此无论表达式返回什么,它都不能分配给具有类型的非可选变量String
第二个问题是valueForKey返回AnyObject!,它可以是任何类的实例 - 但String不是类,您需要Any为了能够将其转换为类String.我认为NSManagedObject返回一个NSString,所以你可以通过这一行实现你所需要的:
let name: String? = (self.detailItem?.valueForKey("name") as? NSString) as? String
Run Code Online (Sandbox Code Playgroud)