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


138

私は次のクラスを持っています:

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

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

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

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


12
あなたが計算されたプロパティを宣言するつもりだ推測numPages:閉鎖は等号を削除するのではなくvar numPages: Int { return categoriesPerPage.count }
ヴァディアン

1
このエラーメッセージの意味をより正確に説明できますか?私はそれをまったく異なる状況で見ています。
William Entriken 2016

2
上記のように、クラススコープでブロックを宣言すると、型で使用できるものに制限されます。インスタンスメンバーへのアクセス権がありません。
Aderstedt 2016

注:エラーメッセージは、遅延変数作成しようとしたときに表示されるメッセージに似ていますが、要件の1つを忘れています。あなたの場合categoriesPerPagevarではなくとして定義されているため、遅延変数は必要ありませんlet
センスフル2016

1
削除= from:var numPages:Int =
andrewz

回答:


131

と言っ= {return self.someValue}たときに構文エラーが発生しただけです。=必要とされていません。

使用する :

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

}

あなただけ取得したい場合は、あなたが書くことができます

var numPages: Int {
     return categoriesPerPage.count
}

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

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

= operatorセッターとして使用できるようにする

myObject.numPages = 5

1
おっと、私は等号を逃しました。ありがとう。
Aderstedt 2015

Int categoriesPerPagevある2次元配列であるを初期化するつもりですか?
Dan

@Dan Your'e、右の例では、単に実証することであるsetもちろん、あなたが割り当てることができません、例をint[int]
ダニエルKrom

これを100万回実行しても、余分な=記号を見逃しました:)
Alexandre G

セミコロンのファムは必要ありません
Peter Schorn

51

これにつまずく人のために、インスタンスではなくクラスを変更しようとしないようにしてください!(変数を静的として宣言していない場合)

例えば。

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

instanceOfMyClass.variable = 'Foo' // Right!

5
これはstatic変数とinstance変数の違いMyClass.variableであり、静的変数として宣言する場合に有効です(すべてのインスタンスで共有)
Daniel Krom

これが私の問題でした。コンテキストがクラス自体ではなくインスタンスを使用しているように思われる場合に、XCodeが類似名のインスタンスの前にオートコンプリートオプションの最初のクラスを配置することを決定したとき、私はそれはちょっと変だと思います。また、インスタンスがケースによってのみ異なる場合は、意図したインスタンスではなくクラスを選択したことに気づきにくい場合があります。ありがとう!
LeftOnTheMoon

19

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

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

クラスのインスタンスをインスタンス化し、その変数でインスタンスメソッドを呼び出します。


私の場合、別のクラスのインスタンスが初期化された後に呼び出される完了ブロックでインスタンス変数を使用しようとしました。もちろん、initはクラス関数であり、インスタンス変数をstaticとして宣言することで問題は解決しました。
ReinhardMänner19年

8

別の例として、次のようなクラスがあります。

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

これは、「クラス」キーワードを使用してメソッドを割り当て(メソッドをタイプメソッドにする)、次のように使用するためです。

Album.getCurrentlyPlayingSongLyric(duration: 5)

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

 // ...

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

 // ...

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


7

時々、Xcodeは、オーバーライドメソッドclass funcが単にではなく追加されますfunc。次に、静的メソッドではインスタンスプロパティを表示できません。見落としがちです。それは私の場合でした。

ここに画像の説明を入力してください


ああありがとう!Xcodeでインスタンスメンバーのオートコンプリートの候補が表示されなかった理由を理解するのに長い時間を費やしました。これはバグのように思える、私は👍🏽Appleとレーダーを提出ます
Apoorv Khatreja

3

あなたの最初の問題は:

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 }()
}

今、コンパイラは満足しています!


0

変数を作成しているにもかかわらず、同じエラーが発生し続けました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

誰かがそのようなクロージャーを本当に必要とする場合に備えて、それは次の方法で行うことができます:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.