Widzę te definicje w bibliotece Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
Jaka jest różnica między funkcją elementu zdefiniowaną jako static func
a inną funkcją zdefiniowaną jako class func
? Czy to po prostu static
dotyczy statycznych funkcji struktur i wyliczeń oraz class
klas i protokołów? Czy są jakieś inne różnice, o których warto wiedzieć? Jakie jest uzasadnienie takiego rozróżnienia w samej składni?
class func
? Z informacji, które mamy teraz, to rozróżnienie wydaje się raczej bezużyteczne, prawda?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Odpowiedzi:
To główna różnica. Niektóre inne różnice polegają na tym, że funkcje klas są wywoływane dynamicznie i mogą zostać zastąpione przez podklasy.
Protokoły używają słowa kluczowego class, ale nie wyklucza to, że struktury implementują protokół, po prostu używają static. Do protokołów wybrano klasę, więc nie byłoby trzeciego słowa kluczowego reprezentującego statyczność lub klasę.
Od Chrisa Lattnera na ten temat:
A oto fragment kodu, który pokazuje niektóre z funkcji nadpisywania funkcji klasowych:
źródło
static func myFunc()
zamiast tegoclass func myFunc
pojawi się następujący błąd l: nie można przesłonić metody statycznej . Dlaczego? Ponieważ to tak, jakby zostało oznaczonefinal
. Po więcej informacji. Zobacz odpowiedź nextD poniżej. Równieżx.dynamicType
został zastąpionytype(of:x)
Aby być bardziej zrozumiałym, robię tutaj przykład,
static func
jest taki sam jakfinal class func
Ponieważ tak jest
final
, nie możemy zastąpić go w podklasie, jak poniżej:źródło
class func
różni się od normalnego,func
chociaż oba można zastąpić. Alefunc
jest dla instancji / obiektu iclass func
można uzyskać do niej dostęp za pośrednictwem klasy, takiej jakClassA.classFunc()
Przeprowadziłem eksperymenty na placu zabaw i wyciągnąłem wnioski.
TL; DR
Jak widać, w przypadku
class
użyciaclass func
lubstatic func
jest to tylko kwestia przyzwyczajenia.Przykład placu zabaw z wyjaśnieniem:
źródło
class
funkcji vs. statyczne wiązaniestatic
jednych.class func
zastąpić?class func
jest nadrzędne. W przeciwnym razie głosowałbym za tym; uwielbiam badania i przykład!Źródło: Swift Programming Language - Właściwości zmiennych typu
źródło
Według książki Swift 2.2 opublikowanej przez Apple:
„Wskazujesz metody pisania, pisząc
static
słowo kluczowe przed słowem kluczowym func metody. Klasy mogą również używaćclass
słowa kluczowego, aby umożliwić podklasom zastąpienie implementacji tej metody przez nadklasę . ”źródło
Od Swift2.0 Apple mówi:
„Zawsze definiuj wymagania właściwości typu przedrostkiem słowem kluczowym static podczas definiowania ich w protokole. Ta reguła dotyczy nawet tego, że wymagania właściwości typu mogą być poprzedzone słowem kluczowym class lub static, jeśli zostaną zaimplementowane przez klasę:”
źródło
Ten przykład wyczyści każdy aspekt!
Wynik:
źródło
Nazywa się to metodami typu i są wywoływane za pomocą składni kropkowej, podobnie jak metody instancji. Jednak metody typu wywołuje się na typie, a nie na instancji tego typu. Oto jak wywołujesz metodę typu w klasie o nazwie SomeClass:
źródło
static
aclass
.