实例成员不能用于类型

我有以下课程:

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

编译失败时会出现以下消息:

实例成员“ Category oriesPerPage”不能用于类型 “ ReportView”

这是什么意思?

194326 次浏览

你只是在说 = {return self.someValue}的时候出现了语法错误,不需要 =

用途:

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


}

如果你想要 只得到你可以写

var numPages: Int {
return categoriesPerPage.count
}

与第一种方式,您也可以添加观察员作为 set willSetdidSet

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

允许使用 = operator作为 setter

myObject.numPages = 5

对于其他偶然发现这个问题的人,请确保您没有试图修改类而不是修改实例!(除非声明变量为 static)

例如。

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


instanceOfMyClass.variable = 'Foo' // Right!

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

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

Album.getCurrentlyPlayingSongLyric(duration: 5)

但是之前谁设置了 playingSong 变量呢? 好的,在这种情况下你不应该使用 class 关键字:

 // ...


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


// ...

现在你可以走了。

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

通过添加 static/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 }
}

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

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

出错的可能性:

如果你的意图是 “使用闭包或函数设置默认属性值”,你只需要稍微改变它。(注意: 这个例子显然不是为了这个目的)

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

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

然而,完全相同的错误出现了:

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

问题是试图用另一个属性的值初始化一个属性。一种解决方案是使初始化程序 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。然后在静态方法中,您不能看到实例属性。很容易被忽视。那是我的案子。

enter image description here