Swift AnyObject的下标,它来自哪里?

前端之家收集整理的这篇文章主要介绍了Swift AnyObject的下标,它来自哪里?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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类对象.
import 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
原文链接:https://www.f2er.com/swift/319795.html

猜你在找的Swift相关文章