2015-08-01 1 views
2

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

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

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

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

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

Свифта состояния документации:

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

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

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

+0

@vacawama уже дал хороший ответ о том, что такое AnyObject. (проголосовали.) Это протокол для всех объектов класса. В swift протокол является типом, поэтому AnyObject означает «любой объект, соответствующий этому протоколу». Я хочу упомянуть, что это НЕ. Это не базовый класс. В отличие от других языков OO, таких как Objective-C, Swift не имеет общего базового класса для всех объектов. Вместо этого все объекты класса соответствуют протоколу AnyObject. –

+0

@ DuncanC Итак, вы говорите, что все объекты класса автоматически соответствуют протоколу AnyObject? –

+0

Да, все объекты класса соответствуют протоколу AnyObject. Таким образом, все экземпляры могут быть назначены переменной AnyObject, и все экземпляры классов могут быть помещены в массив '[AnyObject]'. Вы не можете расширять протокол «AnyObject», поэтому в этом отношении он не действует как базовый класс. – vacawama

ответ

4

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 { 
}