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]
?那么为什么没有任何警告或错误问题?
答案 0 :(得分:5)
为什么没有任何警告或错误问题?
如果你没有说过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
(导入Foundation时) - 一个class
。因此,可以键入AnyObject
。您可以看到可以桥接到here的基础类型的完整列表。
此外值得注意的是,在Swift 3中,everything can be bridged to AnyObject
由于引入了不透明_SwiftValue
类型,它可以在Obj-C兼容框中包含任意Swift值(包括{{1}未导入Foundation时。)
因为任何现在都可以是Array
,所以它与AnyObject
一样弱。除此之外,它还允许您在其上调用任何已知的Any
方法,完全忽略类型安全,并且几乎可以保证您在@objc
拳击时遇到问题。出于这些原因,您应该尽可能避免使用_SwiftValue
。有is nearly always a stronger type可供您使用。
答案 1 :(得分:2)
根据 Apple的文档, AnyObject
可在以下情况下使用:
- 您需要无类型对象的灵活性
- 您使用桥接的Objective-C方法和返回无类型结果的属性
它基本上可以用作任何类的任何实例的类型,无论它是什么。因此,转换为[AnyObject]
的{{1}}仍然是NSArray
可以容纳的对象,因为它的类型无关紧要,因为AnyObject
可以包含任何类类型,例如为AnyObject
。
NSArray
是一个对象数组,因此它是一个值类型。但是,导入[AnyObject]
时,数组可以自动转换为Objective-C桥接类型Foundation
,即 AnyObject 。