Kode berikut dikompilasi di Swift 1.2:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
Apa perbedaan antara fungsi statis dan fungsi kelas ? Yang mana yang harus saya gunakan, dan kapan?
Jika saya mencoba mendefinisikan variabel lain class var myVar2 = ""
, dikatakan:
Properti tersimpan kelas belum didukung di kelas; maksud Anda 'statis'?
Ketika fitur ini didukung, apa perbedaannya antara variabel statis dan variabel kelas (yaitu ketika keduanya didefinisikan dalam kelas)? Yang mana yang harus saya gunakan, dan kapan?
(Xcode 6.3)
Jawaban:
static
danclass
keduanya mengaitkan metode dengan kelas, bukan turunan dari kelas. Perbedaannya adalah bahwa subclass dapat menimpaclass
metode; mereka tidak dapat menggantistatic
metode.class
properti secara teoritis akan berfungsi dengan cara yang sama (subclass dapat menimpanya), tetapi mereka belum memungkinkan di Swift.sumber
final class
fungsi dan fungsi 'statis' di dalam kelas?final
dapat digunakan untuk memotong penggantian lebih lanjut saat digunakan dalam subkelas. Keduanya sama-sama memiliki tempat mereka, saya akan mengatakan penggunaanstatic
ataufinal
ketika digunakan pada fungsi kelas sepele dan hingga pilihan gaya Anda.static func foo(){}
di Swift sepertipublic static final foo(){}
di Jawa?Saya mencoba jawaban dan komentar mipadi di taman bermain. Dan berpikir untuk membagikannya. Ini dia Saya pikir jawaban mipadi harus ditandai sebagai diterima.
sumber
Mengenai OOP , jawabannya terlalu sederhana:
Subclass dapat menimpa metode kelas , tetapi tidak bisa menimpa metode statis .
Selain posting Anda, jika Anda ingin mendeklarasikan variabel kelas (seperti yang Anda lakukan
class var myVar2 = ""
), Anda harus melakukannya sebagai berikut:sumber
Saya mendapat kebingungan ini di salah satu proyek saya juga dan menemukan posting ini, sangat membantu. Mencoba hal yang sama di taman bermain saya dan di sini adalah ringkasannya. Semoga ini bisa membantu seseorang dengan sifat dan fungsi yang tersimpan jenis
static
,final
,class
, override kelas vars dllDan di sini adalah sampel pengujian:
sumber
Pengujian di Swift 4 menunjukkan perbedaan kinerja dalam simulator. Saya membuat kelas dengan "class func" dan struct dengan "static func" dan menjalankannya dalam pengujian.
func statis adalah:
Namun, menjalankan kode yang sama pada iPhone 7 di bawah iOS 10.3 menunjukkan kinerja yang persis sama.
Ini adalah contoh proyek di Swift 4 untuk Xcode 9 jika Anda ingin menguji diri sendiri https://github.com/protyagov/StructVsClassPerformance
sumber
Ada satu perbedaan lagi.
class
dapat digunakan untuk mendefinisikan tipe properti dari tipe yang dikomputasi saja . Jika Anda membutuhkan tipe properti yang tersimpan, gunakanstatic
saja."Anda mendefinisikan properti tipe dengan kata kunci statis. Untuk properti tipe yang dikomputasi untuk tipe kelas, Anda dapat menggunakan kata kunci kelas sebagai gantinya memungkinkan subclass untuk menimpa implementasi superclass."
sumber
Menambahkan ke jawaban di atas metode statis adalah pengiriman statis berarti kompiler tahu metode mana yang akan dieksekusi saat runtime karena metode statis tidak dapat diganti sementara metode kelas dapat menjadi pengiriman dinamis karena subclass dapat menimpanya.
sumber
Ada satu perbedaan lagi. kelas dapat digunakan untuk mendefinisikan properti tipe dari tipe yang dikomputasi saja. Jika Anda membutuhkan properti tipe simpanan, gunakan yang statis.
Kelas: - tipe referensi
struct: - tipe nilai
sumber
class
digunakan di dalamReference Type
(kelas):static
digunakan di dalamReference Type
danValue Type
(class, enum):[Referensi vs Tipe Nilai]
sumber