【问题标题】:'AnyObject' Doesn't have a Member "contactUID" Even thought Intelitype Says it Does?'AnyObject' 没有成员“contactUID” 即使 Intelitype 说它有?
【发布时间】:2015-03-01 00:31:54
【问题描述】:

又一小时的 Swift 编程问题。

我一直在从对象“任何对象”“结果”的数组中返回一个对象的值。 intellitype 说我在数组中有一个值为“ContactUID”的对象,但是当我尝试使用 ContactUID 时,我收到一条错误消息,提示“AnyObject”不包含成员“contactUID”。

名为 HBCContactList 的 Array 成功返回,FirstName、LastName 以及代码中屏幕上列出的所有其他项目。但是它不会返回值“ContactUID”。

模型得到了正确的项目。然而,与其他所有不同...... ContactUID 是一个 INT64 而不是一个字符串......我添加了一些屏幕截图来帮助解释过程。抱歉,这听起来很复杂,但我想我错过了一些愚蠢的东西。

【问题讨论】:

    标签: ios arrays json xcode swift


    【解决方案1】:

    iOS 上的自动完成并不总是准确的,它通常只会列出所有可能的选择器/方法。

    这里问题的根源在于,即使您知道 HCCContactList 仅包含 HBCDirectoryModel 对象,编译器也不会因为 MOContext.executeFetchRequest(freq, error: nil) 返回一个声明它包含 AnyObject 的数组([AnyObject] / Array<AnyObject> )。为了将这些对象中的任何一个称为HBCDirectoryModel,您需要对该类型进行强制转换。

    最简单的方法是将HCCContactList 声明为HBCDirectoryModel 的数组而不是AnyObject 的数组,然后将调用MOContext.executeFetchRequest() 的结果转换为相同的类型。

    你可以这样做

    var HCCContactList: Array<HBCDirectoryModel> = []
    HCCContactList = MOContext.executeFetchRequest(freq, error: nil) as Array<HBCDirectoryModel>
    

    或者使用更短的语法

    var HCCContactList:[HBCDirectoryModel] = []
    HCCContactList = MOContext.executeFetchRequest(freq, error: nil) as [HBCDirectoryModel]
    

    【讨论】:

    • 使用第二种较短的语法解决了我遇到的问题。您所说的确实很有意义..您会说声明为 ANYOBJECT 是不好的做法吗?
    • 是的,在 Swift 中工作时,您应该具体了解类型,因为它提供了很多好处。然而,由于许多 Apple 框架是在底层用 Objective-C 编写的,因此它们通常会返回 [AnyObject],因为 Objective-C 不支持泛型集合。但是,正如我在上面展示的那样,您可以通过快速的“as”转换将它们转换为通用集合。
    • 干杯格伦。我将切换我的一些其他人,因为我想在我继续学习的同时致力于最佳实践。感谢您的帮助。
    • 没问题,斯威夫特快乐
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多