Instance member cannot be used on type

Ade*_*edt 118 instantiation getter-setter swift computed-properties

I have the following class:

class ReportView: NSView {  
    var categoriesPerPage = [[Int]]()
    var numPages: Int = { return categoriesPerPage.count }
}
Run Code Online (Sandbox Code Playgroud)

Compilation fails with the message:

实例成员'categoriesPerPage'不能用于'ReportView'类型

这是什么意思?

Dan*_*rom 118

说话时你只有语法错误= {return self.someValue}.该=是没有必要的.

使用 :

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

}
Run Code Online (Sandbox Code Playgroud)

如果你想获得只有你可以写

var numPages: Int {
     return categoriesPerPage.count
}
Run Code Online (Sandbox Code Playgroud)

通过第一种方式,您还可以添加观察者作为set willSet&didSet

var numPages: Int {
    get{
        return categoriesPerPage.count
    }
    set(v){
       self.categoriesPerPage = v;
    }
}
Run Code Online (Sandbox Code Playgroud)

允许= operator用作制定者

myObject.numPages = 5;
Run Code Online (Sandbox Code Playgroud)


mil*_*czi 114

有时 Xcode 在覆盖方法时会添加class func而不是func. 然后在静态方法中你看不到实例属性。很容易忽视它。这就是我的情况。

在此处输入图片说明

  • 啊谢谢你!我花了很长时间弄清楚为什么我在 Xcode 中没有收到任何实例成员自动完成建议。这似乎是一个错误,我将向 Apple 提交雷达 (4认同)
  • 这实际上不是一个错误。XCTesCase 类同时具有 Suite 级别的拆卸方法“open class func TeaDown()”和实例方法“open func TeaDown()”。它们都可以自动完成。 (4认同)
  • 天啊,谢谢你! (3认同)
  • 自动完成也把我搞砸了。这对我来说也像是一个错误。 (2认同)
  • 谢谢!我一定是瞎了,没看到class这个词。 (2认同)

Der*_*rek 43

对于其他任何偶然发现此事的人,请确保您没有尝试修改类而不是实例!(除非你已将变量声明为静态)

例如.

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

instanceOfMyClass.variable = 'Foo' // Right!
Run Code Online (Sandbox Code Playgroud)

  • 这是`static`变量和`instance`变量之间的区别,如果你将它声明为静态变量(在所有实例之间共享),`MyClass.variable`是有效的. (4认同)

Vla*_*lad 17

它说你有一个实例变量(只有当你有一个类的实例时,var才可见/可访问)并且你试图在静态范围的上下文中使用它(类方法).

您可以通过添加静态属性使实例变量成为类变量.

您可以通过删除class属性使您的类方法成为实例方法.


mgy*_*yky 7

另一个例子是,你有类似的类:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

你也会得到相同类型的错误:

instance member x cannot be used on type x. 
Run Code Online (Sandbox Code Playgroud)

这是因为您为方法分配了"class"关键字(这使得您的方法成为一种类型方法)并使用如下:

Album.getCurrentlyPlayingSongLyric(duration: 5)
Run Code Online (Sandbox Code Playgroud)

但谁之前设置了playSong变量?好.在这种情况下,您不应该使用class关键字:

 // ...

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

 // ...
Run Code Online (Sandbox Code Playgroud)

现在你可以自由地去.


bsh*_*ley 5

您最初的问题是:

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  var numPages: Int = { return categoriesPerPage.count }
}
Run Code Online (Sandbox Code Playgroud)

实例成员“categoriesPerPage”不能在类型“ReportView”上使用

以前的帖子正确地指出,如果你想要一个计算属性,那么=符号是错误的。

额外的错误可能性:

如果您的意图是“使用闭包或函数设置默认属性值”,那么您也只需稍微更改它即可。(注意:这个例子显然不是为了这样做)

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  var numPages: Int = { return categoriesPerPage.count }()
}
Run Code Online (Sandbox Code Playgroud)

我们没有删除=,而是添加了()表示默认初始化闭包。(这在初始化 UI 代码时很有用,可以将其全部保存在一个位置。)

但是,会发生完全相同的错误

实例成员“categoriesPerPage”不能在类型“ReportView”上使用

问题在于尝试使用一个属性的值来初始化另一个属性。一种解决方案是制作初始化程序lazy。在访问该值之前不会执行它。

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  lazy var numPages: Int = { return categoriesPerPage.count }()
}
Run Code Online (Sandbox Code Playgroud)

现在编译器很高兴!