Saya telah melihat banyak alasan mengapa mendesain API menggunakan variabel alih-alih fungsi itu bermasalah dan bagi saya menggunakan properti yang dikomputasi terasa seperti solusi. Ada alasan bagus untuk menjaga agar variabel instan Anda tetap dienkapsulasi. Di sini saya telah membuat protokol Automobile yang sesuai dengan Mobil. Protokol ini memiliki metode accessor yang mengembalikan objek Chassis. Karena Mobil sesuai dengannya, subkelas RaceCar dapat menimpanya dan mengembalikan subkelas Chassis yang berbeda. Ini memungkinkan kelas Mobil memprogram ke antarmuka (Otomotif) dan kelas RaceCar yang tahu tentang RacingChassis dapat mengakses variabel _racingChassis secara langsung.
class Chassis {}
class RacingChassis: Chassis {}
protocol Automobile {
func chassis() -> Chassis
}
class Car: Automobile {
private var _chassis: Chassis
init () {
_chassis = Chassis()
}
func chassis() -> Chassis {
return _chassis
}
}
class RaceCar: Car {
private var _racingChassis: RacingChassis
override init () {
_racingChassis = RacingChassis()
super.init()
}
override func chassis() -> Chassis {
return _racingChassis
}
}
Contoh lain mengapa mendesain API menggunakan variabel rusak adalah ketika Anda memiliki variabel dalam protokol. Jika Anda ingin membagi semua fungsi protokol menjadi ekstensi yang Anda bisa, kecuali properti yang disimpan tidak dapat ditempatkan dalam ekstensi dan harus didefinisikan di kelas (untuk mendapatkan ini untuk dikompilasi Anda harus membatalkan komentar kode di Kelas AdaptableViewController dan hapus variabel mode dari ekstensi):
protocol Adaptable {
var mode: Int { get set }
func adapt()
}
class AdaptableViewController: UIViewController {
// var mode = 0
}
extension AdaptableViewController: Adaptable {
var mode = 0 // compiler error
func adapt() {
//TODO: add adapt code
}
}
Kode di atas akan memiliki kesalahan kompiler ini: "Ekstensi mungkin tidak memiliki properti yang disimpan". Inilah cara Anda dapat menulis ulang contoh di atas sehingga segala sesuatu dalam protokol dapat dipisahkan dalam ekstensi dengan menggunakan fungsi sebagai gantinya:
protocol Adaptable {
func mode() -> Int
func adapt()
}
class AdaptableViewController: UIViewController {
}
extension AdaptableViewController: Adaptable {
func mode() -> Int {
return 0
}
func adapt() {
// adapt code
}
}
strongproperti dan saya mendapatkan kesalahan saat mencoba menimpanya - tetapi sepertinya saya melewatkan bahwa itu diterjemahkan ke "opsional yang tidak terbuka secara implisit" (chassis!) di Cepat, jadioverride var chassis : Chassis!perbaiki.