实例成员不能用于类型
Instance member cannot be used on type
我有以下 class:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
编译失败并显示消息:
Instance member 'categoriesPerPage' cannot be used on type
'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
作为 setter
myObject.numPages = 5
对于偶然发现此问题的任何其他人,请确保您没有试图修改 class 而不是实例! (除非您已将变量声明为静态)
例如。
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
另一个例子是,你 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 的实例时,var 只是 visible/accessible)并且你正试图在静态范围的上下文中使用它(class 方法)。
您可以通过添加 static/class 属性使实例变量成为 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 }
}
Instance member 'categoriesPerPage' cannot be used on type 'ReportView'
以前的帖子正确指出,如果你想要一个计算的属性,=
符号是错误的。
额外的错误可能性:
如果您的意图是 "Setting a Default Property Value with a Closure or Function",您也只需稍微更改一下即可。 (注意:这个例子显然不是为了那样做)
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }()
}
我们没有删除 =
,而是添加了 ()
来表示默认的初始化闭包。 (这在初始化 UI 代码时很有用,可以将其全部保存在一个地方。)
然而,完全相同的错误发生:
Instance member 'categoriesPerPage' cannot be used on type 'ReportView'
问题是试图用另一个 属性 的值初始化一个。一种解决方案是使初始化程序 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
。然后在静态方法中你看不到实例属性。很容易忽略它。我就是这样。
我有以下 class:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
编译失败并显示消息:
Instance member 'categoriesPerPage' cannot be used on type '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
作为 setter
myObject.numPages = 5
对于偶然发现此问题的任何其他人,请确保您没有试图修改 class 而不是实例! (除非您已将变量声明为静态)
例如。
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
另一个例子是,你 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 的实例时,var 只是 visible/accessible)并且你正试图在静态范围的上下文中使用它(class 方法)。
您可以通过添加 static/class 属性使实例变量成为 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 }
}
Instance member 'categoriesPerPage' cannot be used on type 'ReportView'
以前的帖子正确指出,如果你想要一个计算的属性,=
符号是错误的。
额外的错误可能性:
如果您的意图是 "Setting a Default Property Value with a Closure or Function",您也只需稍微更改一下即可。 (注意:这个例子显然不是为了那样做)
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }()
}
我们没有删除 =
,而是添加了 ()
来表示默认的初始化闭包。 (这在初始化 UI 代码时很有用,可以将其全部保存在一个地方。)
然而,完全相同的错误发生:
Instance member 'categoriesPerPage' cannot be used on type 'ReportView'
问题是试图用另一个 属性 的值初始化一个。一种解决方案是使初始化程序 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
。然后在静态方法中你看不到实例属性。很容易忽略它。我就是这样。