Saya memiliki kelas berikut:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Kompilasi gagal dengan pesan:
'CategoriesPerPage' anggota Instance tidak dapat digunakan pada jenis 'ReportView'
Apa artinya ini?
swift
instantiation
getter-setter
computed-properties
Aderstedt
sumber
sumber
numPages
daripada penutupan, hapus tanda sama dengan:var numPages: Int { return categoriesPerPage.count }
categoriesPerPage
didefinisikan sebagaivar
alih-alihlet
.Jawaban:
Anda hanya mengalami kesalahan sintaks saat mengatakan
= {return self.someValue}
. Tidak=
dibutuhkan.Penggunaan:
var numPages: Int { get{ return categoriesPerPage.count } }
jika Anda ingin mendapatkan hanya Anda yang bisa menulis
var numPages: Int { return categoriesPerPage.count }
dengan cara pertama Anda juga dapat menambahkan pengamat sebagai
set
willSet
&didSet
var numPages: Int { get{ return categoriesPerPage.count } set(v){ self.categoriesPerPage = v } }
memungkinkan untuk digunakan
= operator
sebagai penyetelmyObject.numPages = 5
sumber
categoriesPerPage
, yang merupakan array 2-dimv
yang mana Int?set
contoh, dari-tentu saja Anda tidak dapat menetapkanint
ke[int]
Bagi siapa pun yang tersandung pada hal ini, pastikan Anda tidak mencoba mengubah kelas daripada contoh! (kecuali Anda telah mendeklarasikan variabel sebagai statis)
misalnya.
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass' instanceOfMyClass.variable = 'Foo' // Right!
sumber
static
variabel daninstance
variabel,MyClass.variable
valid jika Anda akan mendeklarasikannya sebagai variabel statis (digunakan bersama di semua instance)Terkadang Xcode saat mengganti metode menambahkan,
class func
bukan hanyafunc
. Kemudian dalam metode statis Anda tidak dapat melihat properti instance. Sangat mudah untuk mengabaikannya. Itu kasus saya.sumber
Ini mengatakan Anda memiliki variabel instance (var hanya terlihat / dapat diakses ketika Anda memiliki instance kelas itu) dan Anda mencoba menggunakannya dalam konteks lingkup statis (metode kelas).
Anda dapat menjadikan variabel instance Anda sebagai variabel kelas dengan menambahkan atribut statis / kelas.
Anda membuat instance dari kelas Anda dan memanggil metode instance pada variabel itu.
sumber
Contoh lainnya adalah, Anda memiliki kelas seperti:
@obc class Album: NSObject { let name:String let singer:Singer let artwork:URL let playingSong:Song // ... class func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String { // ... return playingSong.lyric } }
Anda juga akan mendapatkan jenis kesalahan yang sama seperti:
Itu karena Anda menetapkan metode Anda dengan kata kunci "class" (yang menjadikan metode Anda metode tipe) dan menggunakan like:
Album.getCurrentlyPlayingSongLyric(duration: 5)
tapi siapa yang mengatur variabel playingSong sebelumnya? Baik. Anda tidak boleh menggunakan kata kunci kelas untuk kasus itu:
// ... func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String { // ... return playingSong.lyric } // ...
Sekarang Anda bebas untuk pergi.
sumber
Masalah awal Anda adalah:
class ReportView: NSView { var categoriesPerPage = [[Int]]() var numPages: Int = { return categoriesPerPage.count } }
posting sebelumnya dengan benar menunjukkan, jika Anda menginginkan properti yang dihitung ,
=
tandanya salah.Kemungkinan tambahan untuk kesalahan:
Jika maksud Anda adalah untuk "Menetapkan Nilai Properti Default dengan Penutupan atau Fungsi" , Anda hanya perlu sedikit mengubahnya. (Catatan: contoh ini jelas tidak dimaksudkan untuk melakukan itu)
class ReportView: NSView { var categoriesPerPage = [[Int]]() var numPages: Int = { return categoriesPerPage.count }() }
Alih-alih menghapus
=
, kami menambahkan()
untuk menunjukkan penutupan inisialisasi default. (Ini dapat berguna saat menginisialisasi kode UI, untuk menyimpan semuanya di satu tempat.)Namun, kesalahan yang sama persis terjadi:
Masalahnya adalah mencoba menginisialisasi satu properti dengan nilai properti lainnya. Salah satu solusinya adalah membuat penginisialisasi
lazy
. Ini tidak akan dijalankan sampai nilainya diakses.class ReportView: NSView { var categoriesPerPage = [[Int]]() lazy var numPages: Int = { return categoriesPerPage.count }() }
sekarang kompilator senang!
sumber
Saya terus mendapatkan kesalahan yang sama meskipun membuat variabel
static
. Solusi: Bersihkan Bangun, Bersihkan Data Berasal, Mulai Ulang Xcode. Atau pintas Cmd + Shift + Alt + KUserNotificationCenterWrapper.delegate = self public static var delegate: UNUserNotificationCenterDelegate? { get { return UNUserNotificationCenter.current().delegate } set { UNUserNotificationCenter.current().delegate = newValue } }
sumber
Untuk berjaga-jaga jika seseorang benar-benar membutuhkan penutupan seperti itu, itu dapat dilakukan dengan cara berikut:
var categoriesPerPage = [[Int]]() var numPagesClosure: ()->Int { return { return self.categoriesPerPage.count } }
sumber