我有以下课程:
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'类型
这是什么意思?
Answers:
您说的时候只是语法错误= {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
categoriesPerPage
,这是2维数组,v
而Int是?
set
例如, -当然,你不能分配int
到[int]
对于其他偶然发现此问题的人,请确保您未尝试修改类而不是实例!(除非您已将变量声明为静态)
例如。
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
static
变量,instance
变量,MyClass.variable
是有效的,如果你将其声明为静态变量(所有实例之间共享)
就是说您有一个实例变量(只有在拥有该类的实例时var才是可见/可访问的),并且您尝试在静态作用域(类方法)的上下文中使用它。
您可以通过添加static / 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 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
}
}
numPages
而不是闭包,请删除等号:var numPages: Int { return categoriesPerPage.count }