在Swift中,AnyObject如何支持下标,即使是不可下标的类型呢?例:
let numbers: AnyObject = [11,22,33] numbers[0] // returns 11 let prices: AnyObject = ["Bread": 3.49,"Pencil": 0.5] prices["Bread"] // returns 3.49 let number: AnyObject = 5 number[0] // return nil let number: AnyObject = Int(5) number[0] // return nil
然而,如果我的号码被声明为Int,那么这是一个语法错误:
let number: Int = 5 number[0] // won't compile
有趣的是,Any没有下标支持.
这只有在您导入Foundation时才起作用,因为在这种情况下,Swift正在做一些桥接到Objective-C类型 – 在这种情况下是一个NSArray类对象.
原文链接:https://www.f2er.com/swift/319795.htmlimport Foundation let numbers: AnyObject = [11,33] numbers.dynamicType //_SwiftDeferredNSArray.Type
如果您不导入Foundation,那么您甚至不允许进行赋值(因为Swift数组是一个结构体,而不是一个对象).
let numbers: AnyObject = [11,33] // error: contextual type 'AnyObject' cannot be used with array literal
尽管如此,你可以投给任何人:
let numbers: Any = [11,33] numbers.dynamicType // Array<Int>.Type
为什么导入基金会的诀窍呢?这在AnyObject类型描述中有记录:
/// When used as a concrete type,all known `@objc` methods and /// properties are available,as implicitly-unwrapped-optional methods /// and properties respectively,on each instance of `AnyObject`. For /// example: /// /// class C { /// @objc func getCValue() -> Int { return 42 } /// } /// /// // If x has a method @objc getValue()->Int,call it and /// // return the result. Otherwise,return nil.
这意味着您甚至可以调用阵列上不一定存在于NSArray上的方法,但存在于Objective-C世界中,例如:
numbers.lowercaseString // nil
而Swift会优雅地返回一个零值,而不是抛出一个讨厌的对象不能识别选择器异常,就像在Objective-C中会发生的那样.如果这是好还是坏,还是要辩论:)
更新
以上内容似乎只适用于属性和类属性的方法,如果您尝试使用Objective-C方法,那么将遇到无法识别的选择器问题:
import Foundation @objc class TestClass: NSObject { @objc var someProperty: Int = 20 @objc func someMethod() {} } let numbers: AnyObject = [11,33] numbers.lowercaseString // nil numbers.someMethod // nil numbers.someMethod() // unrecognized selector numbers.stringByAppendingString("abc") // unrecognized selector