165

我有以下课程:

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

编译失败并显示以下消息:

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

这是什么意思?

4

8 回答 8

143

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

在此处输入图像描述

于 2020-05-26T05:35:50.390 回答
142

你说的时候只是有语法错误= {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
于 2015-09-02T11:19:23.853 回答
61

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

例如。

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

instanceOfMyClass.variable = 'Foo' // Right!
于 2016-07-07T11:39:19.077 回答
25

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

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

您实例化您的类的一个实例并在该变量上调用实例方法。

于 2017-01-26T21:31:53.153 回答
9

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

@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”关键字(这使您的方法成为类型方法)并使用 like :

Album.getCurrentlyPlayingSongLyric(duration: 5)

但是谁设置了playingSong 变量?好的。对于这种情况,您不应该使用 class 关键字:

 // ...

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

 // ...

现在你可以走了。

于 2016-11-22T06:45:43.747 回答
4

你最初的问题是:

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 代码时很有用,可以将所有代码保存在一个地方。)

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

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

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

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

现在编译器很高兴!

于 2018-09-01T02:18:05.527 回答
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
        }
    }
于 2018-06-06T09:01:27.120 回答
0

万一有人真的需要这样的闭包,可以通过以下方式完成:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
于 2018-11-08T11:35:22.677 回答