这个[AnyObject] return 怎么会是AnyObject呢?

How can this [AnyObject] return as AnyObject?

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
}

这个 internalProgram:[AnyObject] return 怎么能像 AnyObject 一样没有 Xcode 给出警告或错误呢?我知道 program 的类型已经设置为 AnyObject,但我的意思是这怎么能起作用,它不应该是 [AnyObject] 吗?那么为什么没有任何警告或错误问题?

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

  • you need the flexibility of an untyped object
  • you use bridged Objective-C methods and properties that return an untyped result

它基本上可以用作任何 class 的任何实例的类型,无论那是什么。因此,[AnyObject],转换为NSArray,仍然是一个对象,AnyObject可以容纳,因为它的类型无关紧要,因为AnyObject可以容纳任何class类型,例如NSArray.


解释:

[AnyObject]是一个对象数组,所以它是一个值类型。但是,当导入Foundation时,数组可以自动转换为Objective-C桥接类型NSArrayAnyObject.

So why no any warning or error issue?

如果你没有说 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 Arraystruct,不是 class,因此不能直接键入 AnyObject.

然而,你接着说as AnyObject。通过这样做,您 桥接 Swift ArrayNSArray (当 Foundation 被导入时) – 一个class。因此它可以输入为 AnyObject。您可以看到可以桥接到 here.

的基础类型的完整列表

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

因为 anything 现在可以是 AnyObject,它几乎是一个与 Any 一样弱的类型。最重要的是,它还允许你调用 any 已知的 @objc 方法,完全无视类型安全并且几乎肯定会给你带来 _SwiftValue 装箱问题.由于这些原因,您应该尽可能避免使用 AnyObject。有 可供您使用。