Ответ 1
Что касается ответа https://forums.swift.org/t/class-only-protocols-class-vs-anyobject/11507/4, этот ответ не рекомендуется. Эти слова сейчас одинаковы.
DEPRECATED
Обновление: после консультации с полномочиями, эти два определения, как предполагается, эквивалентны, с AnyObject
, используемым в качестве AnyObject
, в то время как class
был закончен. В будущем последние откажутся от первых, но пока они представляют некоторые незначительные различия.
Разница заключается в семантике объявлений @objc
. В AnyObject
, что соответствующие классы могут быть или не быть собственными объектами Objective-C, но язык все равно обрабатывает их как таковые (в этом случае иногда вы теряете статическую диспетчеризацию). Вывод из этого заключается в том, что вы можете лечить AnyObject
et al. ограничение протокола как способ @objc
функций-членов @objc
как показано в примере в документации для AnyObject
в STL:
import Foundation
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. // <===
}
Тот же пример сразу падает, если вы измените его на протокол class
-deriving:
import Foundation
protocol SomeClass : class {}
class C : SomeClass {
@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: SomeClass) -> Int? {
if let f: ()->Int = x.getCValue { // <=== SomeClass has no member 'getCValue'
return f()
}
return nil
}
// A more idiomatic implementation using "optional chaining"
func getCValue2(x: SomeClass) -> Int? {
return x.getCValue?() // <=== SomeClass has no member 'getCValue'
}
// An implementation that assumes the required method is present
func getCValue3(x: SomeClass) -> Int { // <===
return x.getCValue() // <=== SomeClass has no member 'getCValue'
}
Таким образом, кажется, class
- это более консервативная версия AnyObject
которую следует использовать, когда вы заботитесь только о ссылочной семантике, а не о динамическом поиске членов или соединении Objective-C.