Pertanyaan Swift apa yang 'get' dan 'set'?


Saya belajar Swift dan saya membaca The Swift Programming Language dari Apple, saya tidak memiliki latar belakang Objective C (hanya PHP, JS, dan lainnya tetapi tidak ada Obj C)

Pada halaman 24-25 saya melihat kode ini:

//...Class definition stuff...

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

//...Class continues...

Bagian ini TIDAK ditentukan dalam buku dan saya tidak bisa mendapatkan apa itu.

Adakah yang bisa menjelaskan saya apa ini mendapatkan dan set adalah?


76
2017-07-11 13:48


asal


Jawaban:


Itu sebenarnya dijelaskan tepat sebelum kode:

Selain properti sederhana yang disimpan, properti dapat memiliki pengambil dan penyetel.

class EquilateralTriangle: NamedShape {
    ...

Ketika beberapa kelas lain ingin mendapatkan variabel perimeter itu, mereka melakukan ini:

let someVar = myTriangle.perimeter

... Yang memanggil ini:

get{
    return 3.0 * self.sideLength
}

Dan dengan demikian itu pada dasarnya seperti jika pengendali panggilan melakukan ini:

let someVar = 3.0 * myTriangle.sideLength

Ketika kamu set variabel dari objek lain, terlihat seperti ini:

myTriangle.perimeter = 100

Yang memanggil kode di set{} blok:

set {
    sideLength = newValue / 3.0
}

Dan itu seperti jika kelas yang mengatur variabel telah melakukan ini:

myTriangle.sideLength = 100/3.0

Ini benar-benar hanya demi kenyamanan - Anda dapat memanggil ini dari kode lain tanpa harus membagi dengan atau mengalikan dengan 3 sepanjang waktu, karena itu dilakukan dengan benar sebelum menetapkan variabel dan tepat sebelum Anda mendapatkan variabel.

Di Swift, kita dapat memiliki properti yang dihitung saat didapatkan dan dapat melakukan sesuatu saat disetel. Kita bisa melakukan ini di Objective-C juga:

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

21
2017-07-11 13:55



Pengambilan dan pengaturan variabel dalam kelas mengacu pada pengambilan ("mendapatkan") atau mengubah ("pengaturan") isinya.

Pertimbangkan sebuah variabel members sebuah kelas family. Secara alami, variabel ini harus berupa bilangan bulat, karena sebuah keluarga tidak dapat terdiri dari dua titik sesuatu yang orang.

Jadi Anda mungkin akan melanjutkan dengan menentukan members variabel seperti ini:

class family {
   var members:Int
}

Ini, bagaimanapun, akan memberikan orang menggunakan kelas ini kemungkinan untuk mengatur jumlah anggota keluarga menjadi sesuatu seperti 0 atau 1. Dan karena tidak ada yang disebut keluarga 1 atau 0, ini sangat disayangkan.

Ini adalah tempat getter dan setter datang. Dengan cara ini Anda dapat memutuskan sendiri bagaimana variabel dapat diubah dan nilai apa yang dapat mereka terima, serta memutuskan konten apa yang mereka kembalikan.

Kembali ke kelas keluarga kami, mari pastikan tidak ada yang bisa mengaturnya members nilai apa pun yang kurang dari 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')
     }
   }
  }
}

Sekarang kita dapat mengakses members variabel seperti sebelumnya, dengan mengetik instanceOfFamily.members, dan berkat fungsi setter, kita juga dapat mengatur nilainya seperti sebelumnya, dengan mengetik, misalnya: instanceOfFamily.members = 3. Apa yang telah berubah, bagaimanapun, adalah fakta bahwa kita tidak dapat mengatur variabel ini menjadi sesuatu yang lebih kecil dari 2 lagi.

Perhatikan pengenalan dari _members variabel, yang merupakan variabel aktual untuk menyimpan nilai yang kami tetapkan melalui members fungsi penyetel. Asli members kini telah menjadi properti yang dihitung, yang berarti hanya bertindak sebagai antarmuka untuk menangani variabel aktual kami.


95
2017-07-11 14:13



Sebuah pertanyaan sederhana harus diikuti dengan jawaban yang singkat, sederhana dan jelas.

  • Ketika kita mendapatkan nilai properti, ia akan memecatnya get{}bagian.

  • Saat kami menetapkan nilai ke properti, ia mengaktifkannya set{}bagian.

PS. Saat menyetel nilai ke properti, SWIFT secara otomatis membuat konstanta bernama "newValue" = nilai yang kami tetapkan. Setelah "nilai baru" konstan menjadi dapat diakses di properti set{}bagian.

Contoh:

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

15
2017-11-16 02:15



Anda harus melihat Properti yang Dikomputasi

Dalam contoh kode Anda, perimeter adalah properti yang tidak didukung oleh variabel kelas, tetapi nilainya dihitung menggunakan get metode dan disimpan melalui set metode - biasanya disebut sebagai rajin dan setter.

Ketika Anda menggunakan properti itu seperti ini:

var cp = myClass.perimeter

Anda memohon kode yang terkandung dalam get blok kode, dan ketika Anda menggunakannya seperti ini:

myClass.perimeter = 5.0

Anda memohon kode yang terkandung dalam set blok kode, di mana newValue secara otomatis diisi dengan nilai yang diberikan di sebelah kanan operator penugasan.

Properti yang dikomputasi dapat dibaca jika kedua pengambil dan penyetel ditentukan, atau hanya jika pengambil hanya ditentukan.


1
2017-07-11 14:01