Swift'de "alma" ve "ayarlama" nedir?


106

Swift öğreniyorum ve The Swift Programming LanguageApple'dan okuyorum , Objective C geçmişim yok (yalnızca PHP, JS ve diğerleri, ancak Obj C yok)

24-25. Sayfalarda şu kodu görüyorum:

//...Class definition stuff...

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

//...Class continues...

Bu kısım kitapta BELİRTİLMEMİŞTİR ve bunların ne işe yaradığını anlayamıyorum.

Herkes bana ne açıklayabilir olsun ve seti vardır?


2
Alıcı / ayarlayıcı hakkında sayfa 21'i okudunuz mu? Ayrıca, ilk 30 sayfalık bir Swift turu ve tam dokümantasyon değil.
vol7ron

C ++ 'ı yaptıysanız, bunları sınıfın alıcı ve ayarlayıcı üye işlevleriyle ilişkilendirebilirsiniz
CodingOnSteroid

Yanıtlar:


41

Bu aslında koddan hemen önce açıklanmıştır:

Depolanan basit özelliklere ek olarak, özelliklerde bir alıcı ve bir ayarlayıcı bulunabilir.

class EquilateralTriangle: NamedShape {
    ...

Başka bir sınıf bu çevre değişkenini almak istediğinde, bunu yaparlar:

let someVar = myTriangle.perimeter

... Bunu çağıran:

get{
    return 3.0 * self.sideLength
}

Ve bu nedenle, aslında arayan denetleyicinin bunu yapması gibi:

let someVar = 3.0 * myTriangle.sideLength

Ne zaman ayarlamak başka nesneden değişkeni, bu şuna benzer:

myTriangle.perimeter = 100

Bloktaki kodu çağıran set{}:

set {
    sideLength = newValue / 3.0
}

Ve sanki değişkeni ayarlayan sınıf bunu yapmış gibi:

myTriangle.sideLength = 100/3.0

Bu gerçekten sadece kolaylık sağlamak için - bunu her zaman 3'e bölmek veya 3 ile çarpmak zorunda kalmadan başka bir koddan çağırabilirsiniz, çünkü bu, değişkeni ayarlamadan hemen önce ve değişkeni almadan hemen önce yapılır.

Swift'de, alındığında hesaplanan ve ayarlandığında bir şeyler yapabilen özelliklere sahip olabiliriz. Bunu Objective-C'de de yapabiliriz:

// .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;
}

109

Sınıflar içinde değişkenlerin alınması ve ayarlanması, içeriklerinin alınması ("elde edilmesi") veya değiştirilmesi ("ayarlanması") anlamına gelir.

membersBir sınıfın değişkenini düşünün family. Doğal olarak, bu değişkenin bir tamsayı olması gerekir, çünkü bir aile hiçbir zaman iki nokta bir şeyden oluşamaz.

Yani muhtemelen membersdeğişkeni şu şekilde tanımlayarak devam edersiniz :

class family {
   var members:Int
}

Ancak bu, bu sınıfı kullanan kişilere aile üyelerinin sayısını 0 veya 1 gibi bir şeye ayarlama olanağını verecektir. Ve 1 veya 0 ailesi diye bir şey olmadığından, bu oldukça talihsiz bir durumdur.

Alıcıların ve ayarlayıcıların geldiği yer burasıdır. Bu şekilde, değişkenlerin nasıl değiştirilebileceğine ve hangi değerleri alabileceklerine ve hangi içeriğin geri döneceğine karar verebilirsiniz.

Aile sınıfımıza dönersek, kimsenin membersdeğeri 2'den daha azına ayarlayamayacağından emin olalım :

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')
     }
   }
  }
}

Artık membersdeğişkene daha önce olduğu gibi yazarak erişebiliriz ve instanceOfFamily.membersayarlayıcı işlevi sayesinde, değerini daha önce olduğu gibi, örneğin: yazarak da ayarlayabiliriz instanceOfFamily.members = 3. Ancak değişen şey, bu değişkeni artık 2'den küçük bir değere ayarlayamayacağımız gerçeğidir.

Ayarlayıcı işlevi _membersaracılığıyla belirlediğimiz değeri saklamak için gerçek değişken olan değişkenin girişine dikkat edin members. Orijinal membersartık hesaplanmış bir özellik haline geldi, yani yalnızca gerçek değişkenimizle başa çıkmak için bir arayüz görevi görüyor.


members==> count, numberOfMembers; var members : Set<Person>??
GoZoner

1
set (newVal) { ... }newVal ima edilir, dolayısıyla set { _members = newVal }da doğrudur.
AndreasHassing

4
Gibi değişkenlerin _membersözel olması gerektiğine dikkat edin, aksi takdirde komut 2'nin altında bir değere instanceOfFamily._members=1ayarlanırinstanceOfFamily.members
Daniel

Görünüşe göre varsayılan parametrenin adı newValueSwift 4 - docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260
Nolan Amy

21

Basit bir sorunun ardından kısa, basit ve net bir cevap verilmelidir.

  • Mülkün bir değerini aldığımızda, onun bir get{}kısmını ateşler .

  • Mülke bir değer belirlediğimizde, onun set{}parçasını ateşler .

PS. Özelliğe bir değer ayarlarken, SWIFT otomatik olarak "newValue" adında bir sabit = ayarladığımız bir değer oluşturur. Sabit bir "newValue" özelliğinden sonra erişilebilir hale gelir set{}.

Misal:

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

1
üyenin sınıf dışından erişmesi için varsayılan bir değer atanması zorunludur. UserBean: NSObject {var user_id: String? sınıfı için varsayılan değer atadığımda bu sorunu giderilmiştim. = nil} aşağıdaki gibi erişerek kullanıcı: UserBean = UserBean () user.user_id = "23232332"
Amr Angry

2

Hesaplanmış Özelliklere bakmalısınız

Kod örneğinizde, perimeterbir sınıf değişkeni tarafından yedeklenmeyen bir özelliktir, bunun yerine değeri getyöntem kullanılarak hesaplanır veset - genellikle alıcı ve ayarlayıcı olarak adlandırılır .

Bu mülkü böyle kullandığınızda:

var cp = myClass.perimeter

içerdiği kodu çağırıyorsunuz getkod bloğunun kullandığınızda:

myClass.perimeter = 5.0

içerdiği kodu çağırıyorsunuz setnewValueatama operatörünün sağında sağlanan değerle otomatik olarak doldurulan kod bloğunda .

Hesaplanan özellikler, hem alıcı hem de ayarlayıcı belirtilirse yeniden yazılabilir veya yalnızca alıcı belirtilirse salt okunurdur.


0

değişken bildirir ve bir sınıfta böyle çağırır

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

şimdi x'in varsayılan değerini 3'e eşit veya daha fazla yapacak şekilde programlamak istiyorsunuz. Şimdi varsayımsal durumu, eğer x 3'ten küçükse, programınız başarısız olacaktır. yani, insanların ya 3 ya da 3'ten fazlasını koymasını istiyorsunuz. Swift bunu sizin için kolaylaştırdı ve değişken değeriyle çıkmanın bu biraz ilerlemeli yolunu anlamak önemlidir, çünkü bunlar iOS geliştirmede yoğun olarak kullanacaklardır. Şimdi get ve set nasıl kullanılacak burada görelim.

class X {
    var _x: Int = 3
    var x: Int {
        get {
            return _x
        }
        set(newVal) {  //set always take 1 argument
            if newVal >= 3 {
             _x = newVal //updating _x with the input value by the user
            print("new value is: ", _x)
            }
            else {
                print("error must be greater than 3")
            }
        }
    }
}
let y = X()
y.x = 1
print(y.x) //error must be greater than 3
y.x = 8 // //new value is: 8

Hala şüpheleriniz varsa, get ve set kullanımının herhangi bir değişkeni güncellenmesini istediğimiz şekilde güncellemektir. get ve set, mantığınızı yönetmek için size daha iyi kontrol sağlayacaktır. Güçlü bir araç, bu nedenle kolayca anlaşılamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.