Deklarasi di value
bawah ini
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
menyebabkan kesalahan kompilasi berikut
A declaration cannot be both 'final' and 'dynamic'
Mengapa ini terjadi, dan bagaimana saya mengatasinya?
Saya menggunakan Swift 1.2 (versi dikirimkan dalam Xcode 6.3.1 6D1002)
swift
compiler-errors
eonil
sumber
sumber
func test2
deklarasi tidak diperlukan untuk memicu kesalahan, karena dari Xcode 7.3.1.Jawaban:
Masalah ini muncul karena Swift mencoba membuat pengakses dinamis untuk properti statis untuk kompatibilitas Obj-C, karena kelas mewarisi dari
NSObject
.Jika proyek Anda hanya di Swift, daripada menggunakan
var
pengakses, Anda dapat menghindari masalah melalui@nonobjc
atribut di Swift 2.0:sumber
AAA
sini), jadi saya rasa saya jelas?NSManagedObject
subkelas. Ini memperbaikinya!Anda akan mendapatkan kesalahan ini jika kelas Anda memenuhi ketentuan ini.
NSObject
.static let
lapangan.dynamicType
.Saya tidak tahu mengapa ini terjadi, tetapi Anda dapat mencoba solusi ini.
Atau dalam bentuk yang lebih pendek.
Gunakan
static var { get }
sebagai gantistatic let
.Meskipun pengambil properti dan biaya panggilannya sangat mungkin dihilangkan oleh pengoptimal LLVM dalam contoh di atas, Anda mungkin ingin menghindarinya secara eksplisit.
Jika Anda khawatir tentang biaya kalkulasi nilai tersebut, Anda dapat membuatnya sekali dan menyimpan cache seperti ini.
Atau seperti ini jika ingin menyembunyikan keberadaan cache sepenuhnya.
sumber
private static let _value: Int = 111
static var value: Int { return _value }
itu tidak memilikiget {
tetapi kompiler menyebutkan sesuatu tentang properti yang dihitung jika saya gunakanvar
sebagai gantilet
get
dalam hal ini implisit. Apa yang dapat Anda lakukan malah menetapkan hasil penutupan ke variabel sehingga penutupan disebut hanya sekali:let value: Int = { return 111 }()
. Tanda kurung di bagian akhir memanggil penutupan. Tetapi ketahuilah bahwa ini adalah properti yang disimpan lagi dan oleh karena itu tidak tersedia dalam ekstensi.Saya mengalami kesalahan ini juga.
Masalah saya hanyalah var statis dalam ekstensi cepat.
Memindahkannya ke implementasi kelas menyelesaikan masalah bagi saya.
sumber
Saya baru saja tersandung masalah yang sama dengan penyebab yang berbeda dan ingin mempostingnya di sini untuk orang lain yang mengalami pesan kesalahan tidak berguna yang sama.
Kelas terakhir yang menimpa variabel terhitung yang ditentukan dalam ekstensi juga menyebabkan kesalahan ini. Ia bekerja untuk fungsi dan dengan demikian terlihat seperti bug kompilator.
sumber
Saya memecahkan masalah ini dengan memindahkan deklarasi statis ke dalam struct baru yang saya tetapkan di ekstensi.
Jadi, alih-alih ini:
Aku punya ini:
sumber
Anda dapat menandainya sebagai pribadi untuk mencegah kesalahan ini. Jika Anda ingin mengeksposnya, Anda dapat membungkusnya dalam fungsi publik:
Dalam kasus saya, saya hanya mereferensikan properti di ekstensi itu sendiri, jadi tidak perlu mengungkapkannya.
sumber
Sebagai sedikit perbaikan atas jawaban @ Eonil , yang
get
tidak perlu:sumber