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 kuncivar
) 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 kuncilet
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:
willSet
Panggil < sebelum menetapkan yang baharu value 🎜>Dipanggil serta-merta selepas nilai baharu ditetapkan
didSet
- 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 = 800Output pelaksanaan program di atas ialah:
计数器: 100 新增数 100 计数器: 800 新增数 700
Pembolehubah global dan pembolehubah tempatanSifat 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