首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个[AnyObject]如何返回为AnyObject?

这个[AnyObject]如何返回为AnyObject?
EN

Stack Overflow用户
提问于 2017-03-22 13:58:13
回答 2查看 486关注 0票数 2
代码语言:javascript
复制
import Cocoa

class Brain{
    var internalProgram = [AnyObject]()
    var program:AnyObject{
        get{
            return (internalProgram as AnyObject)
        }
    }
}

var savedProgram: AnyObject?
let brain = Brain()
func save(){
    savedProgram = brain.program
}

如果没有Xcode发出警告或错误,这个internalProgram:[AnyObject]如何返回为AnyObject?我知道program的类型已经设置为AnyObject,但我的意思是,这怎么能工作,难道不是[AnyObject]吗?为什么没有任何警告或错误问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 14:39:17

那么,为什么没有任何警告或错误问题呢?

如果你不是as AnyObject的话

代码语言:javascript
复制
class Brain {
    var internalProgram = [AnyObject]()
    var program: AnyObject {
        get {
            // compiler error:
            // Return expression of type '[AnyObject]' does not conform to 'AnyObject'
            return internalProgram
        }
    }
}

编译器告诉我们[AnyObject]不符合AnyObject --这是完全正确的。Swift Arraystruct,而不是class,因此不能将其直接键入为AnyObject

但是,您可以说是as AnyObject。通过这样做,您可以将Swift Array连接到NSArray (导入基金会时)--这是一个class。因此,可以将其键入为AnyObject。您可以看到基金会类型的完整列表,这些类型可以桥接到这里

此外,值得注意的是,在Swift 3中,AnyObject由于引入了不透明的_SwiftValue类型,它可以将任意的Swift值封装在Obj兼容的盒中(包括未导入_SwiftValue时的Array )。

因为现在任何东西都可以是AnyObject,所以它和Any一样弱。除此之外,它还允许您调用它上的任何已知@objc方法,完全不考虑类型安全性,并且几乎肯定会导致_SwiftValue装箱问题。出于这些原因,您应该避免在任何可能的地方使用AnyObject。有几乎总是一种更强的类型可供您使用。

票数 5
EN

Stack Overflow用户

发布于 2017-03-22 14:16:59

根据苹果的文档,AnyObject可以在以下情况下使用:

  • 您需要非类型化对象的灵活性。
  • 使用返回非类型化结果的桥接Objective方法和属性。

它基本上可以用作任何类的任何实例的类型,不管它是什么。因此,转换为[AnyObject]NSArray仍然是AnyObject可以保存的对象,因为它的类型并不重要,因为AnyObject可以保存任何类类型,比如NSArray

解释:

[AnyObject]是一个对象数组,所以它是一个值类型。但是,在导入Foundation时,数组可以自动转换为目标-C桥接类型NSArray,即AnyObject。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42953770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档