我有以下课程:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
编译失败,并显示以下消息:
实例成员'categoriesPerPage'不能用于类型 'ReportView'
这是什么意思?
答案 0 :(得分:111)
说= {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;
答案 1 :(得分:41)
对于其他任何偶然发现此事的人,请确保您不会尝试修改类而不是实例! (除非您已将变量声明为静态)
例如。
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
答案 2 :(得分:35)
答案 3 :(得分:13)
它说你有一个实例变量(只有当你有一个该类的实例时,var才可见/可访问)并且你试图在静态范围的上下文中使用它(类方法)。
您可以通过添加静态属性使实例变量成为类变量。
您可以通过删除class属性使您的类方法成为实例方法。
答案 4 :(得分:6)
另一个例子是,你有类似的课程:
@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" keyword(使您的方法成为类型方法)并使用like:
Album.getCurrentlyPlayingSongLyric(duration: 5)
但之前谁设置了playSong变量?好。在这种情况下你不应该使用class关键字:
// ...
func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
// ...
现在你可以自由地去了。
答案 5 :(得分:1)
您最初的问题是:
Ref::map
实例成员'categoriesPerPage'不能用于'ReportView'类型
以前的帖子正确指出,如果您要使用计算的属性,则class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
标记是错误的。
错误的其他可能性:
如果您要进行“使用闭包或函数设置默认属性值” ,则只需稍作更改即可。 (注意:此示例显然不打算这样做)
=
我们添加class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }()
}
来表示默认的初始化闭包,而不是删除=
。 (这在初始化UI代码时很有用,以将其全部放在一个位置。)
但是,发生 完全相同的错误 :
实例成员'categoriesPerPage'不能用于'ReportView'类型
问题是试图用另一个属性的值初始化一个属性。一种解决方案是制作初始化器()
。除非有人访问该值,否则它将不会执行。
lazy
现在编译器很高兴!
答案 6 :(得分: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
}
}
答案 7 :(得分:0)
只要有人真的需要这样的关闭,就可以通过以下方式完成:
var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
return {
return self.categoriesPerPage.count
}
}