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

时间:2017-03-22 13:58:14

标签: arrays swift casting 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
}

如果没有Xcode发出警告或错误,internalProgram:[AnyObject]如何以AnyObject的形式返回?我知道program的类型已经设置为AnyObject,但我的意思是这怎么可行,并且它不应该是[AnyObject]?那么为什么没有任何警告或错误问题?

2 个答案:

答案 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 Arraystruct,而不是class,因此无法直接键入AnyObject

然而,你说as AnyObject。通过这样做,您桥接 Swift ArrayNSArray(导入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