实例成员不能用于类型

Instance member cannot be used on type

我有以下 class:

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

编译失败并显示消息:

Instance member 'categoriesPerPage' cannot be used on type 'ReportView'

这是什么意思?

你只是在说 = {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 作为 setter

myObject.numPages = 5

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

例如。

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

instanceOfMyClass.variable = 'Foo' // Right!

另一个例子是,你 class 喜欢:

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

 // ...

现在你可以走了。

这是说你有一个实例变量(当你有一个 class 的实例时,var 只是 visible/accessible)并且你正试图在静态范围的上下文中使用它(class 方法)。

您可以通过添加 static/class 属性使实例变量成为 class 变量。

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

尽管创建了变量 static,但我仍然遇到同样的错误。 解决方案:清理构建、清理派生数据、重新启动 Xcode。或捷径 Cmd + Shift+Alt+K

UserNotificationCenterWrapper.delegate = self

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

您最初的问题是:

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

Instance member 'categoriesPerPage' cannot be used on type 'ReportView'

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

额外的错误可能性:

如果您的意图是 "Setting a Default Property Value with a Closure or Function",您也只需稍微更改一下即可。 (注意:这个例子显然不是为了那样做)

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

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

然而,完全相同的错误发生:

Instance member 'categoriesPerPage' cannot be used on type 'ReportView'

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

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

现在编译器很开心!

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

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

有时 Xcode 重写方法时会添加 class func 而不仅仅是 func。然后在静态方法中你看不到实例属性。很容易忽略它。我就是这样。