swift可选链接与演员表

时间:2014-07-11 18:01:07

标签: ios swift

下面的代码突出显示了我将可选链接和强制转换与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
    }
}

以上结果如下:

  

' AnyObject'不能转换为' String'

我能够通过使类变量成为隐式解包的可选项来完成此操作,如下所示:

class MyExample2 {

    var detailItem: NSManagedObject!

    func example() {
        let name: String = self.detailItem.valueForKey("name") as String
    }
}

这样可行,但现在这个变量并不反映我的真实世界需要它是可选的

下一个示例也适用于detailItem:

class MyExample3 {

    var detailItem: NSManagedObject?

    func example() {
        let name: String = self.detailItem?.valueForKey("name").description as String
    }
}

上面的问题是我不得不使用描述。使用此功能的输出向用户显示通常不是一个好主意(根据Apple,只是常识)

以上也是有效的,因为我正在寻找一个字符串。如果我需要一个物体,它就不会起作用。

作为一个兴趣点,这个例子引发了一个不同的错误:

class MyExample4 {

    var detailItem: NSManagedObject?

    func example() {
        let name: String = self.detailItem?.valueForKey("name")
    }
}

上述抛出:

  

找不到会员' valueForKey'

NSmanagedObject显然有一个valueForKey。

再试一次,我发现了一个潜在的解决方案:

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不能直接转换为本机swift类型。正如接受的答案所示,它可以从NSString转换为本机Swift字符串。在这种情况下,这是不必要的。

1 个答案:

答案 0 :(得分:5)

有两个问题:第一个是这一行:

let name: String = self.detailItem?.valueForKey("name") as String

右边部分是可选的(detailItem是可选的),因此无论表达式返回什么,都不能将其分配给类型为String的非可选变量

第二个问题是valueForKey返回AnyObject!,它可以是任何类的实例 - 但String不是类,您需要Any }以便能够将其转换为String。 我认为NSManagedObject会返回NSString,因此您可以通过此行获得所需内容:

let name: String? = (self.detailItem?.valueForKey("name") as? NSString) as? String