web-dev-qa-db-ja.com

インスタンスメンバーはtypeでは使用できません

私は次のクラスがあります。

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

次のメッセージでコンパイルが失敗します。

インスタンスメンバー 'categoriesPerPage'は、タイプ 'ReportView'では使用できません

これは何を意味するのでしょうか?

110
Aderstedt

= {return self.someValue}と言ったときに構文エラーが発生しました。 =は必要ありません。

つかいます :

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

}

あなたが望むなら取得のみあなたは書くことができます

var numPages: Int {
     return categoriesPerPage.count
}

最初の方法では、オブザーバをsetwillSetdidSetとして追加することもできます。

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

セッターとして= operatorを使用することを許可する

myObject.numPages = 5;
111
Daniel Krom

これに遭遇する他の誰にとっても、インスタンスではなくクラスを変更しようとしていないことを確認してください。 (あなたがその変数をstaticとして宣言していない限り)

例えば。

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

instanceOfMyClass.variable = 'Foo' // Right!
42
Derek

インスタンス変数があり(varはそのクラスのインスタンスがある場合にのみ表示/アクセス可能です)、静的スコープ(クラスメソッド)のコンテキストでそれを使用しようとしています。

静的属性を追加することで、インスタンス変数をクラス変数にすることができます。

Class属性を削除することで、クラスメソッドをインスタンスメソッドにすることができます。

14
Vlad

もう1つの例は、次のようなクラスがあるということです。

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

次のような同じ種類のエラーも発生します。

instance member x cannot be used on type x. 

それはあなたが "class"キーワード(あなたのメソッドをtypeメソッドにする)とlikeを使ってあなたのメソッドを割り当てるからです。

Album.getCurrentlyPlayingSongLyric(duration: 5)

しかし、誰が以前にplayingSong変数を設定しましたか? OK。その場合はclassキーワードを使用しないでください。

 // ...

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

 // ...

今、あなたは自由に行くことができます。

6
mgyky

最初の問題は、

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

インスタンスメンバー 'categoriesPerPage'は、タイプ 'ReportView'では使用できません

計算プロパティが必要な場合は、以前の投稿で正しく指摘されていますが、=記号は誤りです。

エラーの追加可能性:

あなたの意図が"クロージャや関数を使ったデフォルトのプロパティ値の設定"であれば、それもわずかに変更する必要があります。 (注:この例は明らかにそうすることを意図していませんでした)

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

=を削除する代わりに、デフォルトの初期化クロージャを示すために()を追加します。 (これは、UIコードを初期化するときに、すべてを1か所にまとめるために役立ちます。)

ただし、まったく同じエラーが発生します。

インスタンスメンバー 'categoriesPerPage'は、タイプ 'ReportView'では使用できません

問題は、あるプロパティを別のプロパティの値で初期化しようとしています。 1つの解決策は、初期化子をlazyにすることです。誰かが値にアクセスするまで実行されません。

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

今コンパイラは幸せです!

1
bshirley

変数staticを作成したにもかかわらず、同じエラーが発生し続けました。解決策:クリーンビルド、派生データのクリーン化、Xcodeの再起動。またはショートカットCmd + Shift + Alt + K

UserNotificationCenterWrapper.delegate = self

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

万が一誰かがそのようなクロージャを必要とするのであれば、それは次のようにして行うことができます。

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
0
algrid