Это работает, только если вы импортируете Foundation
, поскольку Swift делает в этом случае некоторое соединение с типами Objective-C
— в данном случае объект, подобный NSArray
.
import Foundation
let numbers: AnyObject = [11, 22, 33] as AnyObject
type(of: numbers) //_SwiftDeferredNSArray.Type
Если вы не импортируете Foundation
, вам даже не разрешено выполнять назначение (поскольку массив Swift является структурой, а не объектом).
let numbers: AnyObject = [11, 22, 33] // error: contextual type 'AnyObject' cannot be used with array literal
Однако вы можете использовать Any
:
let numbers: Any = [11, 22, 33]
type(of: numbers) // Array<Int>.Type
Почему import Foundation
помогает? Это задокументировано в описании типа 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 изящно вернет вам значение nil
вместо того, чтобы выдать неприятное исключение object does not recognises selector
, как это произошло бы в Objective-C. Хорошо это или плохо, остается спорить :)
Обновление Похоже, что вышеприведенное работает только для свойств и методов, подобных свойствам. Если вы попытаетесь использовать метод Objective-C, вы столкнетесь с проблемой нераспознанного селектора:
import Foundation
@objc class TestClass: NSObject {
@objc var someProperty: Int = 20
@objc func someMethod() {}
}
let numbers: AnyObject = [11, 22, 33] as AnyObject
numbers.lowercaseString // nil
numbers.someMethod // nil
numbers.someMethod() // unrecognized selector
numbers.stringByAppendingString("abc") // unrecognized selector
person
Cristik
schedule
21.01.2016
AnyObject
для объекта, чей правильный тип может вывести компилятор, и вы, разработчик, точно знаете. Apple в любом случае настоятельно не рекомендует использовать (такие) аннотации типов. - person vadian   schedule 22.01.2016NSJSONSerialization.JSONObjectWithData
возвращаетAnyObject
- person Steve Kuo   schedule 22.01.2016