快速可选的链接与演员
下面的代码突出显示了一个问题,我将可选的链接和苹果的快速语言结合起来
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 } }
以上结果是:
'AnyObject'不能转换为'String'
我能够做到这一点,使类variables隐式解包可选如下:
class MyExample2 { var detailItem: NSManagedObject! func example() { let name: String = self.detailItem.valueForKey("name") as String } }
这工作,但现在这个variables不反映我的真实世界需要它是可选的
下一个例子也可以与detailItem一起使用作为可选项:
class MyExample3 { var detailItem: NSManagedObject? func example() { let name: String = self.detailItem?.valueForKey("name").description as String } }
上面的问题是我不得不使用描述。 使用这个函数的输出向用户展示通常不是一个好主意(根据苹果的说法,只是常识)
以上也只适用于我正在寻找一个string。 如果我需要一个对象,这是行不通的。
作为感兴趣的一点,这个例子会引发一个不同的错误:
class MyExample4 { var detailItem: NSManagedObject? func example() { let name: String = self.detailItem?.valueForKey("name") } }
以上抛出:
找不到成员'valueForKey'
NSmanagedObject显然有一个valueForKey。
再尝试一下,我发现了一个潜在的解决scheme:
class MyExamplePotentialSolution { var detailItem: NSManagedObject? func example() { let name: NSString = self.detailItem?.valueForKey("name") as NSString } }
上面的问题是,实际分配给UITableViewCell detailTextLabel.text属性时,它不起作用。
有任何想法吗?
更新的答案
最简单的现实世界用法原来是这样的:
cell.detailTextLabel.text = self.detailItem?.valueForKey("name") as? NSString
关键是AnyObject不能直接转换为原生的swifttypes。 正如接受的答案所示,它可以从NSString转换为本地Swiftstring。 在这种情况下,这是没有必要的。
有两个问题:第一个是在这一行:
let name: String = self.detailItem?.valueForKey("name") as String
右边的部分是一个可选的( detailItem
是可选的),所以无论expression式返回,它都不能被分配给一个非可选的variablestypes为String
第二个问题是valueForKey
返回AnyObject!
,它可以是任何类的实例 – 但是String
不是一个类,为了能够把它转换成一个String
,你需要Any
。 我假设NSManagedObject
返回一个NSString
,所以你可以用这一行来实现你所需要的:
let name: String? = (self.detailItem?.valueForKey("name") as? NSString) as? String