Ade*_*edt 118 instantiation getter-setter swift computed-properties
I have the following class:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Run Code Online (Sandbox Code Playgroud)
Compilation fails with the message:
实例成员'categoriesPerPage'不能用于'ReportView'类型
这是什么意思?
Dan*_*rom 118
说话时你只有语法错误= {return self.someValue}.该=是没有必要的.
使用 :
var numPages: Int {
get{
return categoriesPerPage.count
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想获得只有你可以写
var numPages: Int {
return categoriesPerPage.count
}
Run Code Online (Sandbox Code Playgroud)
通过第一种方式,您还可以添加观察者作为set willSet&didSet
var numPages: Int {
get{
return categoriesPerPage.count
}
set(v){
self.categoriesPerPage = v;
}
}
Run Code Online (Sandbox Code Playgroud)
允许= operator用作制定者
myObject.numPages = 5;
Run Code Online (Sandbox Code Playgroud)
mil*_*czi 114
有时 Xcode 在覆盖方法时会添加class func而不是func. 然后在静态方法中你看不到实例属性。很容易忽视它。这就是我的情况。
Der*_*rek 43
对于其他任何偶然发现此事的人,请确保您没有尝试修改类而不是实例!(除非你已将变量声明为静态)
例如.
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
Run Code Online (Sandbox Code Playgroud)
Vla*_*lad 17
它说你有一个实例变量(只有当你有一个类的实例时,var才可见/可访问)并且你试图在静态范围的上下文中使用它(类方法).
您可以通过添加静态属性使实例变量成为类变量.
您可以通过删除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
}
}
Run Code Online (Sandbox Code Playgroud)
你也会得到相同类型的错误:
instance member x cannot be used on type x.
Run Code Online (Sandbox Code Playgroud)
这是因为您为方法分配了"class"关键字(这使得您的方法成为一种类型方法)并使用如下:
Album.getCurrentlyPlayingSongLyric(duration: 5)
Run Code Online (Sandbox Code Playgroud)
但谁之前设置了playSong变量?好.在这种情况下,您不应该使用class关键字:
// ...
func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
// ...
Run Code Online (Sandbox Code Playgroud)
现在你可以自由地去.
您最初的问题是:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Run Code Online (Sandbox Code Playgroud)
实例成员“categoriesPerPage”不能在类型“ReportView”上使用
以前的帖子正确地指出,如果你想要一个计算属性,那么=符号是错误的。
额外的错误可能性:
如果您的意图是“使用闭包或函数设置默认属性值”,那么您也只需稍微更改它即可。(注意:这个例子显然不是为了这样做)
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }()
}
Run Code Online (Sandbox Code Playgroud)
我们没有删除=,而是添加了()表示默认初始化闭包。(这在初始化 UI 代码时很有用,可以将其全部保存在一个位置。)
但是,会发生完全相同的错误:
实例成员“categoriesPerPage”不能在类型“ReportView”上使用
问题在于尝试使用一个属性的值来初始化另一个属性。一种解决方案是制作初始化程序lazy。在访问该值之前不会执行它。
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
lazy var numPages: Int = { return categoriesPerPage.count }()
}
Run Code Online (Sandbox Code Playgroud)
现在编译器很高兴!
| 归档时间: |
|
| 查看次数: |
105966 次 |
| 最近记录: |