Örnek üyesi tür üzerinde kullanılamaz


139

Aşağıdaki sınıf var:

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

Derleme şu iletiyle başarısız oluyor:

'ReportP' türünde örnek üyesi 'categoryPerPage' kullanılamaz

Ne anlama geliyor?


12
numPagesBir kapatma yerine bir hesaplanmış mülkiyet ilan edeceğinizi tahmin etmek eşit işareti silmek:var numPages: Int { return categoriesPerPage.count }
vadian

1
Lütfen bu hata mesajının tam olarak ne anlama geldiğini daha ayrıntılı bir şekilde açıklayabilir miyiz? Bunu tamamen farklı bir bağlamda görüyorum.
William Entriken

2
Yukarıdaki gibi sınıf kapsamındaki bir bloğu bildirdiğinizde, bu türde mevcut olanlarla sınırlandırılırsınız. Hiçbir örnek üyeye erişiminiz yok.
Aderstedt

Not: Hata mesajı, tembel bir değişken oluşturmaya çalışırken aldığınız mesaja benzer, ancak gereksinimlerden birini unuttu . Sizin durumunuzda tembel bir değişken istemezsiniz çünkü bunun yerine categoriesPerPageolarak tanımlanır . varlet
16'da

1
Kaldır = from: var numPages: Int =
andrewz

Yanıtlar:


132

Söylerken sadece sözdizimi hatası var = {return self.someValue}. Gerek =yok.

Kullanım:

var numPages: Int {
    get{
        return categoriesPerPage.count
    }

}

İstersen olsun sadece yazabilirsiniz

var numPages: Int {
     return categoriesPerPage.count
}

ilk yöntemle gözlemcileri set willSet&didSet

var numPages: Int {
    get{
        return categoriesPerPage.count
    }
    set(v){
       self.categoriesPerPage = v
    }
}

= operatorayarlayıcı olarak kullanılmasına izin vermek

myObject.numPages = 5

1
Hata! Eşit işareti kaçırdım. Teşekkürler.
Aderstedt

Başlatacağınızı söylüyorsunuz categoriesPerPage, hangi vInt ile 2-dim dizisi ?
Dan

@Dan Your'e sağ, örnek sadece göstermek için bir setders-sen atayamıyoruz, örnek intiçine[int]
Daniel Krom

Bunu bir milyon kez
Alexandre G

noktalı virgül famasına ihtiyacınız yok
Peter Schorn

51

Bunun üzerine tökezleyen herkes için örnek yerine sınıfı değiştirmeye çalışmadığınızdan emin olun! (değişkeni statik olarak bildirmediyseniz)

Örneğin.

MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'

instanceOfMyClass.variable = 'Foo' // Right!

5
Bu, staticdeğişken ve instancedeğişken arasındaki farktır , MyClass.variablestatik değişken olarak bildirirseniz geçerlidir (tüm örnekler arasında paylaşılır)
Daniel Krom

Bu benim sorunumdu. XCode, bağlamı sınıfın kendisinden ziyade örneği kullanarak kesinlikle işaret ettiğinde benzer şekilde adlandırılmış bir örnekten önce sınıfı otomatik tamamlama seçeneklerinde ilk sıraya koymaya karar verdiğinde garip buluyorum. Örneğin, örneğinizin yalnızca duruma göre değiştiği durumlarda, istediğiniz örneği değil, sınıfı seçtiğinizi fark etmek zor olabilir. Teşekkürler!
LeftOnTheMoon

19

Bir örnek değişkeniniz var (var yalnızca bu sınıfın bir örneğine sahip olduğunuzda görünür / erişilebilir) ve bunu statik bir kapsam bağlamında (sınıf yöntemi) kullanmaya çalışıyorsunuz.

Statik / sınıf özniteliği ekleyerek örnek değişkeninizi bir sınıf değişkeni yapabilirsiniz.

Sınıfınızın bir örneğini başlatır ve bu değişken üzerinde örnek yöntemini çağırırsınız.


Benim durumumda, tamamlama bloğunda başka bir sınıfın bir örneği başlatıldıktan sonra çağrılan bir örnek değişkeni kullanmaya çalıştım. Elbette, bir init bir sınıf fonksiyonudur ve örnek değişkenini statik olarak bildirmek sorunu çözmüştür.
Reinhard Männer

8

Başka bir örnek, sınıfınız var:

@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
    }
}

ayrıca aşağıdaki gibi aynı hatayı alırsınız:

instance member x cannot be used on type x. 

Bunun nedeni, yönteminizi "class" anahtar kelimesiyle (yönteminizi bir tür yöntemi yapar) atamanız ve beğen komutunun kullanılmasıdır:

Album.getCurrentlyPlayingSongLyric(duration: 5)

ama daha önce playSong değişkenini kim ayarladı? Tamam. Bu durumda class anahtar sözcüğünü kullanmamalısınız:

 // ...

 func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
        // ...
       return playingSong.lyric
 }

 // ...

Artık gitmekte özgürsünüz.


8

Bazen Xcode geçersiz kılma yöntemleri class funcyerine sadece ekler func. Sonra statik yöntemde örnek özelliklerini göremezsiniz. Göz ardı etmek çok kolay. Benim durumum buydu.

resim açıklamasını buraya girin


Ah teşekkürler! Neden Xcode herhangi bir örnek üye otomatik tamamlama önerileri alamadım anlamaya uzun zaman geçirdim. Bu bir hata gibi görünüyor, Apple with🏽 ile bir radar dosyalayacağım
Apoorv Khatreja

3

İlk sorununuz:

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

'ReportP' türünde örnek üyesi 'categoryPerPage' kullanılamaz

önceki yayınlar doğru bir şekilde işaret eder, hesaplanan bir özellik istiyorsanız , =işaret arızalıdır.

Hata için ek olasılık:

Eğer niyet etmek olsaydı "Bir Kapatma veya Function ile bir Varsayılan Özellik Değer ayarlama" , sadece hafifçe yanı değiştirmek gerekmez. (Not: Bu örnek açıkça bunu yapmak için tasarlanmamıştır)

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

Bunun yerine kaldırma =, biz eklemek() varsayılan başlatma kapatmasını belirtmek için . (Bu, tek bir yerde tutmak için UI kodunu başlatırken yararlı olabilir.)

Ancak, aynı hata oluşur:

'ReportP' türünde örnek üyesi 'categoryPerPage' kullanılamaz

Sorun, bir özelliği diğerinin değeriyle başlatmaya çalışıyor. Bir çözüm başlatıcı yapmaktır lazy. Değere erişilene kadar yürütülmez.

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

şimdi derleyici mutlu!


0

Değişken yapma aynı hatayı almaya devam ettim static. Çözüm: Derlemeyi Temizle, Türetilmiş Verileri Temizle, Xcode'u yeniden başlatın. Veya Cmd + Üst Karakter + Alt + K kısayolu

UserNotificationCenterWrapper.delegate = self

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

0

Birisinin gerçekten böyle bir kapanmaya ihtiyacı olması durumunda , aşağıdaki şekilde yapılabilir:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.