Sifat Swift


Sifat Swift mengaitkan nilai dengan kelas, struktur atau penghitungan tertentu.

Atribut boleh dibahagikan kepada atribut yang disimpan dan atribut yang dikira:

存储属性计算属性
存储常量或变量作为实例的一部分计算(而不是存储)一个值
用于类和结构体用于类、结构体和枚举

Sifat tersimpan dan sifat yang dikira biasanya digunakan pada keadaan jenis tertentu.

Atribut juga boleh digunakan secara langsung pada jenis itu sendiri.

Selain itu, anda juga boleh menentukan pemerhati atribut untuk memantau perubahan dalam nilai atribut untuk mencetuskan operasi tersuai. Pemerhati harta boleh ditambahkan pada sifat disimpan yang ditulis oleh anda sendiri, atau pada sifat yang diwarisi daripada kelas induk.


Sifat Tersimpan

Ringkasnya, sifat tersimpan ialah pemalar atau pembolehubah yang disimpan dalam contoh kelas atau struktur tertentu.

Atribut yang disimpan boleh menjadi atribut storan berubah-ubah (ditakrifkan dengan kata kunci var) atau atribut storan malar (ditakrifkan dengan kata kunci let).

  • Anda boleh menentukan nilai lalai apabila mentakrifkan atribut yang disimpan

  • Anda juga boleh menetapkan atau mengubah suai nilai atribut yang disimpan semasa pembinaan proses, atau bahkan mengubah suainya Nilai atribut storan malar

import Cocoa

struct Number
{
   var digits: Int
   let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.pi)")

Hasil keluaran pelaksanaan program di atas ialah:

67
3.1415

Pertimbangkan kod berikut:

let pi = 3.1415

Dalam kod, pi mentakrifkan atribut storan, tentukan nilai lalai (pi = 3.1415), jadi tidak kira apabila anda membuat instantiat struct, ia tidak akan berubah.

Jika anda mentakrifkan atribut storan malar, ralat akan dilaporkan jika anda cuba mengubah suainya, seperti yang ditunjukkan di bawah:

import Cocoa

struct Number
{
    var digits: Int
    let numbers = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.numbers)")
n.numbers = 8.7

Apabila melaksanakan atur cara di atas, ralat akan dilaporkan dan ralatnya adalah seperti berikut:

error: cannot assign to property: 'numbers' is a 'let' constant
n.numbers = 8.7

bermaksud 'nombor' ialah pemalar, anda tidak boleh mengubah suainya.


Harta simpanan malas

Harta simpanan malas merujuk kepada harta yang nilai awalnya tidak dikira sehingga ia dipanggil buat kali pertama.

Gunakan lazy sebelum pengisytiharan atribut untuk menandakan atribut storan malas.

Nota:
Sifat storan malas mesti diisytiharkan sebagai pembolehubah (menggunakan kata kunci var) kerana nilai sifat itu mungkin tidak tersedia sehingga pembinaan contoh selesai. Sifat malar mesti mempunyai nilai awal sebelum proses pembinaan selesai, jadi ia tidak boleh diisytiharkan sebagai sifat tertunda.

Atribut storan tertunda biasanya digunakan untuk:

  • Penciptaan objek tertunda.

  • Apabila nilai atribut bergantung pada kelas lain yang tidak diketahui

import Cocoa

class sample {
    lazy var no = number() // `var` 关键字是必须的
}

class number {
    var name = "php Swift 教程"
}

var firstsample = sample()
print(firstsample.no.name)

Hasil keluaran pelaksanaan program di atas ialah:

php Swift 教程

Pembolehubah segera

Jika anda mempunyai pengalaman dengan Objective-C, anda harus tahu bahawa Objective-C menyediakan dua kaedah untuk menyimpan nilai dan rujukan untuk contoh kelas. Untuk sifat, anda juga boleh menggunakan pembolehubah contoh sebagai storan bahagian belakang untuk nilai harta.

Dalam bahasa pengaturcaraan Swift, teori ini disatukan dan dilaksanakan menggunakan atribut. Sifat dalam Swift tidak mempunyai pembolehubah contoh yang sepadan dan storan bahagian belakang sifat tidak boleh diakses secara langsung. Ini mengelakkan masalah kaedah capaian dalam senario yang berbeza, dan juga memudahkan takrifan atribut ke dalam satu pernyataan.

Semua maklumat tentang sifat dalam jenis—termasuk penamaan, jenis dan ciri pengurusan memori—ditakrifkan di satu tempat (dalam takrif jenis).


Sifat yang dikira

Selain sifat yang disimpan, kelas, struktur dan penghitungan boleh mentakrifkan Sifat yang dikira tidak menyimpan nilai secara langsung, tetapi menyediakan pengambil . Mendapat nilai dan penetap pilihan untuk secara tidak langsung menetapkan nilai sifat atau pembolehubah lain.

import Cocoa

class sample {
    var no1 = 0.0, no2 = 0.0
    var length = 300.0, breadth = 150.0
    
    var middle: (Double, Double) {
        get{
            return (length / 2, breadth / 2)
        }
        set(axis){
            no1 = axis.0 - (length / 2)
            no2 = axis.1 - (breadth / 2)
        }
    }
}

var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)

print(result.no1)
print(result.no2)

Output pelaksanaan program di atas ialah:

(150.0, 75.0)
-150.0
-65.0

Jika penetap sifat yang dikira tidak mentakrifkan nama parameter yang mewakili nilai baharu, nama lalai newValue boleh digunakan.


Sifat pengiraan baca sahaja

Sifat terkira dengan hanya pengambil dan tiada penetap ialah sifat pengiraan baca sahaja.

Sifat pengiraan baca sahaja sentiasa mengembalikan nilai dan boleh diakses melalui pengendali titik (.), tetapi nilai baharu tidak boleh ditetapkan.

import Cocoa

class film {
    var head = ""
    var duration = 0.0
    var metaInfo: [String:String] {
        return [
            "head": self.head,
            "duration":"\(self.duration)"
        ]
    }
}

var movie = film()
movie.head = "Swift 属性"
movie.duration = 3.09

print(movie.metaInfo["head"]!)
print(movie.metaInfo["duration"]!)

Output pelaksanaan program di atas ialah:

Swift 属性
3.09

Nota:

mesti menggunakan kata kunci var untuk mentakrifkan sifat yang dikira, termasuk baca sahaja sifat dikira, kerana nilai mereka tidak tetap. Kata kunci let hanya digunakan untuk mengisytiharkan atribut malar, menunjukkan nilai yang tidak boleh diubah suai selepas pemulaan.


Pemerhati Harta

Pemerhati Harta memantau dan bertindak balas terhadap perubahan dalam nilai harta Pemerhati hartanah dipanggil setiap kali harta ditetapkan kepada nilai, walaupun untuk nilai baharu Ini tidak terkecuali apabila ia adalah sama dengan nilai semasa.

Anda boleh menambah pemerhati harta untuk sifat tersimpan lain kecuali sifat tersimpan yang malas, dan anda juga boleh menambah pemerhati harta untuk sifat yang diwarisi (termasuk sifat tersimpan dan sifat yang dikira) dengan melebihkan sifat.

Nota:
Tidak perlu menambah pemerhati hartanah untuk sifat yang dikira yang tidak boleh terlebih beban, kerana perubahan nilai boleh dipantau dan dijawab terus melalui penetap.

Anda boleh menambah satu atau semua pemerhati berikut pada sifat:

  • willSetPanggil

  • < sebelum menetapkan yang baharu value 🎜>
  • Dipanggil serta-merta selepas nilai baharu ditetapkandidSet

  • Pemerhati willSet dan didSet tidak akan dipanggil semasa pemulaan hartanah

  • import Cocoa
    
    class Samplepgm {
        var counter: Int = 0{
            willSet(newTotal){
                print("计数器: \(newTotal)")
            }
            didSet{
                if counter > oldValue {
                    print("新增数 \(counter - oldValue)")
                }
            }
        }
    }
    let NewCounter = Samplepgm()
    NewCounter.counter = 100
    NewCounter.counter = 800
Output pelaksanaan program di atas ialah:

计数器: 100
新增数 100
计数器: 800
新增数 700


Pembolehubah global dan pembolehubah tempatan

Sifat dikira dan pemerhati sifat Corak yang diterangkan juga boleh digunakan untuk pembolehubah global dan pembolehubah tempatan .


Atribut jenis

Atribut jenis ditulis dalam pendakap kerinting paling luar ({}) jenis sebagai sebahagian daripada definisi jenis.

Gunakan kata kunci statik untuk menentukan atribut jenis untuk jenis nilai dan kelas kata kunci untuk menentukan atribut jenis untuk kelas.

struct Structname {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // 这里返回一个 Int 值
   }
}

enum Enumname {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // 这里返回一个 Int 值
   }
}

class Classname {
   class var computedTypeProperty: Int {
      // 这里返回一个 Int 值
   }
}

Nota:
Sifat jenis yang dikira dalam contoh adalah baca sahaja, tetapi anda juga boleh mentakrifkan sifat jenis pengiraan yang boleh dibaca dan boleh ditulis, serupa dengan sintaks sifat yang dikira contoh.


Mendapatkan dan menetapkan nilai atribut jenis

Sama seperti atribut contoh, atribut jenis juga diakses melalui pengendali titik (.). Walau bagaimanapun, sifat jenis diperoleh dan ditetapkan melalui jenis itu sendiri, bukan melalui contoh. Contohnya adalah seperti berikut:

import Cocoa

struct StudMarks {
   static let markCount = 97
   static var totalCount = 0
   var InternalMarks: Int = 0 {
      didSet {
         if InternalMarks > StudMarks.markCount {
            InternalMarks = StudMarks.markCount
         }
         if InternalMarks > StudMarks.totalCount {
            StudMarks.totalCount = InternalMarks
         }
      }
   }
}

var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()

stud1Mark1.InternalMarks = 98
print(stud1Mark1.InternalMarks) 

stud1Mark2.InternalMarks = 87
print(stud1Mark2.InternalMarks)

Hasil output pelaksanaan program di atas ialah:

97
87