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]吗?为什么没有任何警告或错误问题?
发布于 2017-03-22 14:39:17
那么,为什么没有任何警告或错误问题呢?
如果你不是as AnyObject的话
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 Array是struct,而不是class,因此不能将其直接键入为AnyObject。
但是,您可以说是as AnyObject。通过这样做,您可以将Swift Array连接到NSArray (导入基金会时)--这是一个class。因此,可以将其键入为AnyObject。您可以看到基金会类型的完整列表,这些类型可以桥接到这里。
此外,值得注意的是,在Swift 3中,AnyObject由于引入了不透明的_SwiftValue类型,它可以将任意的Swift值封装在Obj兼容的盒中(包括未导入_SwiftValue时的Array )。
因为现在任何东西都可以是AnyObject,所以它和Any一样弱。除此之外,它还允许您调用它上的任何已知@objc方法,完全不考虑类型安全性,并且几乎肯定会导致_SwiftValue装箱问题。出于这些原因,您应该避免在任何可能的地方使用AnyObject。有几乎总是一种更强的类型可供您使用。
发布于 2017-03-22 14:16:59
根据苹果的文档,AnyObject可以在以下情况下使用:
它基本上可以用作任何类的任何实例的类型,不管它是什么。因此,转换为[AnyObject]的NSArray仍然是AnyObject可以保存的对象,因为它的类型并不重要,因为AnyObject可以保存任何类类型,比如NSArray。
解释:
[AnyObject]是一个对象数组,所以它是一个值类型。但是,在导入Foundation时,数组可以自动转换为目标-C桥接类型NSArray,即AnyObject。
https://stackoverflow.com/questions/42953770
复制相似问题