Anggota instance tidak dapat digunakan pada tipe

142

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?

Aderstedt
sumber
12
Merasa Anda akan mendeklarasikan properti yang dihitung numPagesdaripada penutupan, hapus tanda sama dengan:var numPages: Int { return categoriesPerPage.count }
vadian
1
Bisakah dijelaskan lebih lengkap dengan tepat apa arti pesan kesalahan ini? Saya melihatnya dalam konteks yang sama sekali berbeda.
William Entriken
2
Saat Anda mendeklarasikan blok dalam cakupan kelas, seperti di atas, Anda dibatasi pada apa yang tersedia di tipe. Anda tidak memiliki akses ke anggota instance mana pun.
Aderstedt
Catatan: Pesan kesalahan ini mirip dengan yang Anda dapatkan saat mencoba membuat variabel malas tetapi lupa salah satu persyaratannya . Dalam kasus Anda, Anda tidak menginginkan variabel lazy karena categoriesPerPagedidefinisikan sebagai varalih-alih let.
Senseful
1
Hapus = dari: var numPages: Int =
andrewz

Jawaban:

135

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 = operatorsebagai penyetel

myObject.numPages = 5
Daniel Krom
sumber
1
Ups, saya melewatkan tanda yang sama. Terima kasih.
Aderstedt
Anda mengatakan Anda akan menginisialisasi categoriesPerPage, yang merupakan array 2-dim vyang mana Int?
Dan
@ Dan Your'e benar, misalnya ini hanya untuk menunjukkan setcontoh, dari-tentu saja Anda tidak dapat menetapkan intke[int]
Daniel Krom
Lakukan ini jutaan kali dan masih melewatkan ekstra = tanda :)
Alexandre G
Anda tidak memerlukan keluarga titik koma
Peter Schorn
54

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!
Derek
sumber
5
Ini adalah perbedaan antara staticvariabel dan instancevariabel, MyClass.variablevalid jika Anda akan mendeklarasikannya sebagai variabel statis (digunakan bersama di semua instance)
Daniel Krom
Ini adalah masalahku. Saya merasa agak aneh ketika XCode memutuskan untuk menempatkan kelas terlebih dahulu dalam opsi pelengkapan otomatis sebelum contoh yang memiliki nama serupa ketika konteksnya tampaknya mengarah ke saya pasti menggunakan contoh daripada kelas itu sendiri. Dan dalam kasus di mana contoh Anda hanya berbeda berdasarkan kasus, mungkin sulit untuk memperhatikan Anda memilih kelas daripada contoh yang Anda maksudkan. Terima kasih!
LeftOnTheMoon
26

Terkadang Xcode saat mengganti metode menambahkan, class funcbukan hanya func. Kemudian dalam metode statis Anda tidak dapat melihat properti instance. Sangat mudah untuk mengabaikannya. Itu kasus saya.

masukkan deskripsi gambar di sini

milczi
sumber
1
Terima kasih! Menghabiskan waktu lama untuk mencari tahu mengapa saya tidak mendapatkan saran pelengkapan otomatis anggota instance di Xcode. Sepertinya ini bug, saya akan mengajukan radar ke Apple 👍🏽
Apoorv Khatreja
Pelengkapan otomatis juga mengacaukan saya. Ini juga terlihat seperti bug bagi saya.
Deitsch
20

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.

Vlad
sumber
Dalam kasus saya, saya mencoba menggunakan variabel instance di blok penyelesaian yang dipanggil setelah instance dari kelas lain telah diinisialisasi. Tentu saja, init adalah fungsi kelas, dan mendeklarasikan variabel instan sebagai statik menyelesaikan masalah.
Reinhard Männer
9

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:

instance member x cannot be used on type x. 

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.

mgyky
sumber
3

Masalah awal Anda adalah:

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  var numPages: Int = { return categoriesPerPage.count }
}

'CategoriesPerPage' anggota Instance tidak dapat digunakan pada jenis 'ReportView'

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:

'CategoriesPerPage' anggota Instance tidak dapat digunakan pada jenis 'ReportView'

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!

bshirley.dll
sumber
0

Saya terus mendapatkan kesalahan yang sama meskipun membuat variabel static. Solusi: Bersihkan Bangun, Bersihkan Data Berasal, Mulai Ulang Xcode. Atau pintas Cmd + Shift + Alt + K

UserNotificationCenterWrapper.delegate = self

public static var delegate: UNUserNotificationCenterDelegate? {
        get {
            return UNUserNotificationCenter.current().delegate
        }
        set {
            UNUserNotificationCenter.current().delegate = newValue
        }
    }
Naishta
sumber
0

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
    }
}
algrid.dll
sumber