Poniższy kod kompiluje się w Swift 1.2:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
Jaka jest różnica między funkcją statyczną a funkcją klasową ? Którego powinienem użyć i kiedy?
Jeśli spróbuję zdefiniować inną zmienną class var myVar2 = ""
, powie:
Właściwości przechowywane w klasie nie są jeszcze obsługiwane w klasach; miałeś na myśli „static”?
Kiedy ta funkcja jest obsługiwana, jaka będzie różnica między zmienną statyczną a zmienną klasy (tj. Kiedy obie są zdefiniowane w klasie)? Którego powinienem użyć i kiedy?
(Xcode 6.3)
Odpowiedzi:
static
iclass
oba wiążą metodę z klasą, a nie z instancją klasy. Różnica polega na tym, że podklasy mogą zastępowaćclass
metody; nie mogą zastąpićstatic
metod.class
właściwości będą teoretycznie działać w ten sam sposób (podklasy mogą je zastąpić), ale nie są jeszcze możliwe w Swift.źródło
final class
funkcją a funkcją „statyczną” w obrębie klasy?final
może być użyty do odcięcia dalszych przesłonięcia podczas stosowania w podklasie. Oba mają swoje miejsce, powiedziałbym, że użyciestatic
lubfinal
użycie funkcji klasy jest trywialne i zależy od twojego stylu.static func foo(){}
w Swift jest jakpublic static final foo(){}
w Javie?Próbowałem odpowiedzi i komentarzy mipadi na placu zabaw. I pomyślałem o udostępnieniu. Proszę bardzo. Myślę, że odpowiedź mipadi powinna zostać oznaczona jako zaakceptowana.
źródło
W odniesieniu do OOP odpowiedź jest zbyt prosta:
Podklasy mogą zastępować metody klasowe , ale nie mogą zastępować metod statycznych .
Oprócz swojego postu, jeśli chcesz zadeklarować zmienną klasową (tak jak zrobiłeś
class var myVar2 = ""
), powinieneś to zrobić w następujący sposób:źródło
Ten zamieszanie dostałem również w jednym z moich projektów i uważam ten post za bardzo pomocny. Próbowałem tego samego na moim placu zabaw, a oto podsumowanie. Nadzieję, że to pomoże ktoś z zapisanymi właściwościami i funkcjami typu
static
,final
,class
, przesłanianie klasy Vars etc.A oto próbki testowe:
źródło
Testy w Swift 4 pokazują różnicę wydajności w symulatorze. Zrobiłem klasę z „klasą func” i struktury z „statyczną func” i przetestowałem je.
funkcja statyczna to:
Jednak uruchomienie tego samego kodu na iPhonie 7 w systemie iOS 10.3 pokazuje dokładnie taką samą wydajność.
Oto przykładowy projekt w Swift 4 dla Xcode 9, jeśli chcesz się przetestować https://github.com/protyagov/StructVsClassPerformance
źródło
Jest jeszcze jedna różnica.
class
może służyć do definiowania właściwości typu tylko typu obliczanego . Jeśli potrzebujesz właściwości typu przechowywanego, użyjstatic
zamiast tego.„Definiujesz właściwości typu za pomocą słowa kluczowego static. W przypadku właściwości typu obliczanego dla typów klas możesz zamiast tego użyć słowa kluczowego class, aby umożliwić podklasom zastąpienie implementacji nadklasy.”
źródło
Dodanie do powyższych odpowiedzi metody statyczne są statyczną wysyłką, oznacza to, że kompilator wie, która metoda zostanie wykonana w czasie wykonywania, ponieważ metody statycznej nie można zastąpić, podczas gdy metoda klasy może być dynamiczną wysyłką, ponieważ podklasa może je zastąpić.
źródło
Jest jeszcze jedna różnica. Klasa może być używana do definiowania właściwości typu tylko typu obliczanego. Jeśli potrzebujesz właściwości typu przechowywanego, użyj statycznej.
Klasa: - typ odniesienia
struct: - typ wartości
źródło
class
jest używany wewnątrzReference Type
(klasa):static
jest używany wewnątrzReference Type
iValue Type
(klasa, wyliczanie):[Odniesienie a typ wartości]
źródło