Нуждаете се от пояснение относно 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")
]

Това трябва да е вярно или в противен случай няма да можете да преобразувате с оператора за преобразуване на типа (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 означава всеки обект, който отговаря на този протокол. Искам да спомена какво НЕ Е. Това не е базов клас. За разлика от други OO езици като 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 е протокол. Ако го въведете в Playground и щракнете върху командата, изскача следното:

/// 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