微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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’ is not convertible to ‘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")
    }
}

以上抛出:

Could not find member ‘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字符串.在这种情况下,没有必要.

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐