我有以下课程:
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 }
}
编译失败并显示以下消息:
实例成员 'categoriesPerPage' 不能用于类型 '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
用作二传手
myObject.numPages = 5
对于偶然发现此问题的任何其他人,请确保您没有尝试修改类而不是实例!(除非您已将变量声明为静态)
例如。
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”关键字(这使您的方法成为类型方法)并使用 like :
Album.getCurrentlyPlayingSongLyric(duration: 5)
但是谁设置了playingSong 变量?好的。对于这种情况,您不应该使用 class 关键字:
// ...
func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
// ...
现在你可以走了。
你最初的问题是:
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 }()
}
现在编译器很高兴!
尽管制作了变量,但我一直收到同样的错误static
。解决方案:清理构建,清理派生数据,重新启动 Xcode。或快捷键
Cmd + Shift+Alt+K
UserNotificationCenterWrapper.delegate = self
public static var delegate: UNUserNotificationCenterDelegate? {
get {
return UNUserNotificationCenter.current().delegate
}
set {
UNUserNotificationCenter.current().delegate = newValue
}
}
万一有人真的需要这样的闭包,可以通过以下方式完成:
var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
return {
return self.categoriesPerPage.count
}
}