Нужно разъяснение по AnyObject в Swift

Прежде чем начать, я уже прочитал документацию Swift. Я все еще пытаюсь понять, что такое AnyObject. Является ли это базовым классом для всех объектов/классов в Swift, как NSObject в Objective C?

Если я создам массив типа [AnyObject] и заполню его экземплярами класса Movie, это будет означать, что AnyObject является базовым классом Класс Кино, верно?

let someObjects: [AnyObject] = [
    Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
    Movie(name: "Moon", director: "Duncan Jones"),
    Movie(name: "Alien", director: "Ridley Scott")
]

Это должно быть правдой, иначе вы не сможете выполнить downcast с помощью оператора приведения типов (as!), верно?

for object in someObjects {
    let movie = object as! Movie
    println("Movie: '\(movie.name)', dir. \(movie.director)")
}

В документации Swift указано:

AnyObject может представлять экземпляр любого типа класса.

Итак... представьте это в том смысле, что AnyObject является экземпляром базового класса?

Я новичок в Swift, поэтому, пожалуйста, наберитесь терпения :)


person Walter M    schedule 01.08.2015    source источник
comment
@vacawama уже дал хороший ответ о том, что такое AnyObject. (проголосовали.) Это протокол для всех объектов класса. В swift протокол — это тип, поэтому AnyObject означает любой объект, соответствующий этому протоколу. Я хочу упомянуть, что это НЕ. Это не базовый класс. В отличие от других объектно-ориентированных языков, таких как Objective-C, Swift не имеет общего базового класса для всех объектов. Вместо этого все объекты класса соответствуют протоколу AnyObject.   -  person Duncan C    schedule 02.08.2015
comment
@DuncanC Итак, вы говорите, что все объекты класса автоматически соответствуют протоколу AnyObject?   -  person Walter M    schedule 02.08.2015
comment
Да, все объекты класса соответствуют протоколу AnyObject. Таким образом, все экземпляры могут быть назначены переменной AnyObject, а все экземпляры класса могут быть помещены в массив [AnyObject]. Вы не можете расширить протокол AnyObject, поэтому в этом отношении он не действует как базовый класс.   -  person vacawama    schedule 02.08.2015
comment
@vacawama Ааа. Благодарю вас! Это все объясняет! Я бы хотел, чтобы они поместили это в документацию. :)   -  person Walter M    schedule 02.08.2015


Ответы (1)


AnyObject — это протокол. Если вы наберете его на игровой площадке и щелкнете по нему командой, появится следующее всплывающее окно:

/// The protocol to which all classes implicitly conform.
///
/// 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:
///
/// .. parsed-literal:
///
///   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.
///   func getCValue1(x: AnyObject) -> Int? {
///     if let f: ()->Int = **x.getCValue** {
///       return f()
///     }
///     return nil
///   }
///
///   // A more idiomatic implementation using "optional chaining"
///   func getCValue2(x: AnyObject) -> Int? {
///     return **x.getCValue?()**
///   }
///
///   // An implementation that assumes the required method is present
///   func getCValue3(x: AnyObject) -> **Int** {
///     return **x.getCValue()** // x.getCValue is implicitly unwrapped.
///   }
///
/// See also: `AnyClass`
@objc protocol AnyObject {
}
person vacawama    schedule 01.08.2015