快速可选的链接与演员

下面的代码突出显示了一个问题,我将可选的链接和苹果的快速语言结合起来

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