Dokumentasi Swift mengatakan bahwa class , struct , dan enum semuanya dapat menyesuaikan dengan protokol, dan saya dapat mencapai titik di mana semuanya sesuai. Tapi saya tidak bisa mendapatkan enum untuk berperilaku seperti contoh class dan struct :
protocol ExampleProtocol {
var simpleDescription: String { get set }
mutating func adjust()
}
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
enum SimpleEnum: ExampleProtocol {
case Base
var simpleDescription: String {
get {
return "A Simple Enum"
}
set {
newValue
}
}
mutating func adjust() {
self.simpleDescription += ", adjusted"
}
}
var c = SimpleEnum.Base
c.adjust()
let cDescription = c.simpleDescription
Saya belum menemukan cara untuk mendapatkan simpleDescription
perubahan sebagai hasil dari panggilan adjust()
. Contoh saya jelas tidak akan melakukannya karena pengambil memiliki nilai hard-code, tetapi bagaimana saya dapat menetapkan nilai untuk simpleDescription
sementara masih sesuai dengan ExampleProtocol
?
swift
enums
swift-protocols
Adrian Harris Crowne
sumber
sumber
adjust
fungsinya kembaliVoid
dalamExampleProtocol
, itu sama dengan hanya menggunakanmutating func adjust()
. Jika Anda inginadjust
memiliki tipe pengembalian, Anda dapat mengubah protokol ke: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Ini pendapat saya.
Karena ini adalah
enum
dan bukan aclass
, Anda harus berpikir berbeda (TM) : deskripsi Anda yang harus berubah ketika "keadaan" Andaenum
berubah (seperti yang ditunjukkan oleh @ hu-qiang).Semoga membantu.
sumber
Berikut pendekatan lain, hanya menggunakan pengetahuan yang diperoleh dari tur hingga saat itu *
Jika Anda ingin
adjust()
bertindak sebagai toggle (meskipun tidak ada yang menyarankan hal ini), gunakan:* (Meskipun tidak secara eksplisit menyebutkan cara menentukan tipe kembalian dan protokol)
sumber
Berikut adalah solusi yang tidak mengubah nilai enum saat ini, tetapi nilai instance-nya (untuk berjaga-jaga jika itu berguna bagi siapa saja).
sumber
self = copy(self, self.desc + ", asdfasdf")
Tidak mungkin untuk mendefinisikan variabel tanpa getter dan setter dalam enum dan oleh karena itu tidak mungkin memiliki variabel yang dapat Anda modifikasi.
Anda dapat mengikuti protokol tetapi Anda tidak dapat memiliki perilaku yang sama dengan mutasi seperti di kelas.
sumber
Ini adalah tautan tentang enum dengan cepat.
Struktur dan enumerasi adalah tipe nilai. Secara default, properti dari tipe nilai tidak dapat diubah dari dalam metode instance-nya. tautan
Kemudian, Anda harus menggunakan fungsi mutasi.
sumber
Opsi lainnya adalah untuk menyesuaikan () untuk beralih antar kasus sebagai berikut:
sumber
Inilah membangun jawaban Jack:
sumber
Saya datang dengan ini
sumber
inilah kode saya
sumber
Kontribusi pertama saya di sini:
Terima kasih untuk yang lainnya!
sumber
Eksperimen ini membuat saya bingung juga, karena contoh SimpleClass dan SimpleStructure sebelumnya yang menunjukkan properti simpleDescription sedang dimodifikasi secara internal, yang membuat saya berpikir bahwa saya perlu melakukan hal yang sama. Setelah melihat jawaban lain yang diposting di sini dan membaca dokumentasi resmi Apple Swift 2.1, saya mendapatkan ini:
Perhatikan juga bahwa dalam contoh yang diberikan oleh Apple untuk SimpleClass dan SimpleStructure sebelum percobaan ini, deskripsi sederhana hilang secara internal - Anda tidak bisa mendapatkan kembali nilai aslinya (kecuali tentu saja Anda menyimpannya di luar kelas / struktur); inilah yang mendorong saya untuk membuat metode restore () untuk contoh SimpleEnum, yang memungkinkan Anda untuk beralih antara nilai-nilai. Semoga ini bermanfaat bagi seseorang!
sumber
Saya berpikir bahwa tujuannya hanyalah untuk mempertahankan status dan menggunakan deskripsi untuk membuat status saat ini lebih mudah dibaca:
sumber
Variasi lain: Menggunakan nilai terkait untuk menahan dan menampilkan opsi sebelumnya (dari bentuk "Dipilih 1, disesuaikan dari 2, disesuaikan dari 1, disesuaikan dari 2, disesuaikan dari 1")
sumber
bagaimana dengan ini
sumber