2014-07-11 18 views
67

uczę Swift i czytam The Swift Programming Language firmy Apple, nie mam tła Objective C (tylko PHP, JS i inne, ale nie obj C)Swift czym są 'get' i 'set'?

Na stronie 24-25 widzę ten kod:

//...Class definition stuff... 

var perimeter: Double { 
    get { 
     return 3.0 * sideLength 
    } 
    set { 
     sideLength = newValue/3.0 
    } 
} 

//...Class continues... 

Ta część nie jest określony w książce i nie mogę dostać co to jest za.

Czy ktoś może mi wyjaśnić, co to jest uzyskać i zestaw są?

+0

Komentarze wyczyszczone – vol7ron

+1

Czytałaś str 21 o getter/setter. Co więcej, pierwsze 30 pgs to * wycieczka * Swift, a nie pełna dokumentacja. – vol7ron

+0

Jeśli zrobiłeś C++, możesz współtworzyć te rzeczy z funkcjami gettera i settera z klasy – AbhimanyuAryan

Odpowiedz

17

To faktycznie wyjaśnił tuż przed kodem:

Oprócz prostych właściwości, które są składowane, właściwości może mieć getter i setter.

class EquilateralTriangle: NamedShape { 
    ... 

Kiedy jakaś inna klasa chce dostać tę zmienną obwodowej, robią to:

let someVar = myTriangle.perimeter 

... Który nazywa to:

get{ 
    return 3.0 * self.sideLength 
} 

I tak w zasadzie to tak, jakby kontroler dzwoniący zrobił to:

let someVar = 3.0 * myTriangle.sideLength 

Kiedy ustawić zmienna od innego obiektu, wygląda to tak:

myTriangle.perimeter = 100 

Które wywołuje kod w bloku set{}:

set { 
    sideLength = newValue/3.0 
} 

i tak to tak, jakby klasa, która ustawiła zmienną, wykonała to:

myTriangle.sideLength = 100/3.0 

To naprawdę tylko dla wygody - można nazwać to z innym kodem bez konieczności dzielenia przez lub pomnożyć przez 3 cały czas, bo to jest zrobione tuż przed ustawieniem zmiennej i tuż przed uzyskać zmienną.

W Swift możemy mieć właściwości, które są obliczane, gdy otrzymamy i możemy coś zrobić po ustawieniu.Możemy to zrobić w Objective-C za:

// .h 
@property (nonatomic) double perimeter; 

//.m 

- (double)perimeter 
{ 
    return self.sideLength * 3.0; 
} 
- (void)setPerimeter:(double)perimeter 
{ 
    self.perimeter = perimeter; // In Swift, this is done automatically. 
    self.sideLength = perimeter/3.0; 
} 
+1

Nie wiem, Obj C, zobacz mój komentarz na moje pytanie. Zamierzam edytować pytanie. –

+0

Dodano dla ciebie angielskie wyjaśnienie, @ Mr.Web;) – Undo

0

Należy spojrzeć na Computed Properties

W swojej próbki kodu perimeter jest właściwością nie poparte zmiennej klasy, a nie jej wartość jest obliczana za pomocą get sposób i przechowywane metodą set - zwykle nazywane getter i nastawczym.

Podczas korzystania że własność tak:

var cp = myClass.perimeter 

jesteś powołując kod zawarty w bloku kodu get i kiedy go używać tak:

myClass.perimeter = 5.0 

jesteś Wywoływanie kod zawarty w bloku kodu set, gdzie newValue automatycznie napełniony wartości znajdujących się po prawej stronie operatora przypisania.

właściwości Obliczone może ReadWrite gdy oba getter i ustawiająca jest określona, ​​lub tylko do odczytu, gdy pochłaniacz jest określony wyłącznie.

91

Zdobycie i ustawienie zmiennych w klasach dotyczy albo pobierania („uzyskanie”) lub zmiany („Ustawienia”), ich zawartość.

Rozważmy zmienną members klasy family. Naturalnie ta zmienna musiałaby być liczbą całkowitą, ponieważ rodzina nigdy nie może składać się z dwóch punktów coś dla ludzi.

Tak byłoby chyba śmiało definiując zmienną members tak:

class family { 
    var members:Int 
} 

To jednak da osób korzystających z tej klasy możliwość ustawienia liczby członków rodziny do czegoś jak 0 lub 1 A ponieważ nie ma czegoś takiego jak rodzina 1 lub 0, jest to dość niefortunne.

W tym miejscu przychodzą setery i setery. W ten sposób możesz sam zdecydować, w jaki sposób można zmieniać zmienne i jakie wartości mogą one otrzymać, a także decydować o tym, jakie treści zwrócą.

Wracając do naszej klasy rodzinnej, zróbmy pewny nikt nie może ustawić wartość members do niczego mniej niż 2:

class family { 
    var _members:Int = 2 
    var members:Int { 
    get { 
    return _members 
    } 
    set (newVal) { 
    if newVal >= 2 { 
     _members = newVal 
    } else { 
     println('error: cannot have family with less than 2 members') 
    } 
    } 
    } 
} 

Teraz możemy uzyskać dostęp do zmiennej members jak poprzednio, wpisując instanceOfFamily.members, a dzięki funkcja setera, możemy również ustawić jej wartość jak poprzednio, wpisując na przykład: instanceOfFamily.members = 3. Zmieniło się jednak to, że nie możemy ustawić tej zmiennej na nic mniejszą niż 2.

Zwróć uwagę na wprowadzenie zmiennej _members, która jest bieżącą zmienną przechowującą wartość, którą ustawiamy za pomocą funkcji ustawiającej members. Oryginalny members stał się teraz własnością obliczeniową, co oznacza, że ​​działa on tylko jako interfejs do radzenia sobie z naszą rzeczywistą zmienną.

+0

'members' ==> count',' numberOfMembers'; 'var members: Set ' ?? – GoZoner

+1

'set (newVal) {...}', domniemanie newVal, więc 'set {_members = newVal}' również jest poprawne. –

+4

Należy zauważyć, że zmienne takie jak '_members' powinny być prywatne, w przeciwnym razie polecenie' instanceOfFamily._members = 1' ustawiłoby wartość "instanceOfFamily.members' na wartość poniżej 2 – Daniel

11

Po prostym pytaniu powinna następować krótka, prosta i jasna odpowiedź.

  • Kiedy otrzymujemy wartość nieruchomości, wystrzeliwuje jej część get{}.

  • Po ustawieniu wartości na obiekcie uruchamia się jej część set{}.

PS. Podczas ustawiania wartości do właściwości, SWIFT automatycznie tworzy stałą o nazwie "nowaWartość" = wartość, którą ustawiamy. Po stałej "nowej wartości" staje się dostępna w części set{} nieruchomości.

Przykład:

var A:Int = 0 
var B:Int = 0 

var C:Int { 
get {return 1} 
set {print("Recived new value", newValue, " and stored into 'B' ") 
    B = newValue 
    } 
} 

//When we are getting a value of C it fires get{} part of C property 
A = C 
A   //Now A = 1 

//When we are setting a value to C it fires set{} part of C property 
C = 2 
B   //Now B = 2 
+0

jest obowiązkowe przypisanie domyślnej wartości dostępu członka spoza klasy. miałem ten problem ustalone kiedy przypisać wartość domyślną dla niego klasa UserBean: NSObject {var user_id: String? = Nil } dostępu do niego jak na poniższym użytkownik wynajęcia: UserBean = UserBean() user.user_id = "23232332" –