实例成员不能用于类型


138

我有以下课程:

class ReportView: NSView {  
    var categoriesPerPage = [[Int]]()
    var numPages: Int = { return categoriesPerPage.count }
}

编译失败,并显示以下消息:

实例成员'categoriesPerPage'不能用于'ReportView'类型

这是什么意思?


12
猜测您将要声明一个计算属性numPages而不是闭包,请删除等号:var numPages: Int { return categoriesPerPage.count }
vadian 2015年

1
能否更详尽地解释此错误消息的含义?我在完全不同的环境中看到它。
William Entriken '16

2
当像上面那样在类范围中声明一个块时,您将被限制为该类型中可用的块。您无权访问任何实例成员。
Aderstedt '16

注意:该错误消息类似于您尝试创建惰性变量时所收到的错误消息,但忘记了其中一项要求。在您的情况下,由于categoriesPerPage定义为var,因此您不需要惰性变量let
有意义的2016年

1
从以下位置删除=:var numPages:Int =
andrewz

Answers:


132

您说的时候只是语法错误= {return self.someValue}。该=是没有必要的。

用 :

var numPages: Int {
    get{
        return categoriesPerPage.count
    }

}

如果你只想得到就可以写

var numPages: Int {
     return categoriesPerPage.count
}

通过第一种方法,您还可以将观察者添加为set willSetdidSet

var numPages: Int {
    get{
        return categoriesPerPage.count
    }
    set(v){
       self.categoriesPerPage = v
    }
}

允许= operator用作二传手

myObject.numPages = 5

1
糟糕,我错过了等号。谢谢。
Aderstedt

您是说要初始化categoriesPerPage,这是2维数组,v而Int是?
丹·丹

@丹傻冒权,这个例子只是为了演示set例如, -当然,你不能分配int[int]
丹尼尔·克罗姆

做了一百万次,但仍然错过了多余的= :)
Alexandre G

您不需要分号
Peter Schorn

51

对于其他偶然发现此问题的人,请确保您未尝试修改类而不是实例!(除非您已将变量声明为静态)

例如。

MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'

instanceOfMyClass.variable = 'Foo' // Right!

5
这之间的差异static变量,instance变量,MyClass.variable是有效的,如果你将其声明为静态变量(所有实例之间共享)
丹尼尔·克罗姆

这是我的问题。当XCode决定上下文优先使用实例而不是类本身指向上下文时,当XCode决定将类放在自动完成选项中的相似名称实例之前时,我觉得有点奇怪。而且在实例仅因情况而异的情况下,可能很难注意到您选择的是类,而不是想要的实例。谢谢!
6

19

就是说您有一个实例变量(只有在拥有该类的实例时var才是可见/可访问的),并且您尝试在静态作用域(类方法)的上下文中使用它。

您可以通过添加static / class属性使实例变量成为类变量。

您实例化类的实例,然后对该变量调用实例方法。


就我而言,我尝试在完成块中使用一个实例变量,该变量在初始化另一个类的实例之后调用。当然,init是一个类函数,并且将实例变量声明为static可以解决该问题。
ReinhardMänner,

8

另一个示例是,您拥有类似的类:

@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
 }

 // ...

现在您可以自由了。


7

有时,Xcode会在覆盖方法时添加class func而不是func。然后在静态方法中看不到实例属性。忽略它很容易。那是我的情况。

在此处输入图片说明


啊,谢谢你!花了很长时间弄清楚为什么我在Xcode中没有得到任何实例成员自动完成建议。这似乎是一个错误,我会提交雷达与苹果👍🏽
Apoorv Khatreja

3

您最初的问题是:

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 }()
}

现在编译器很高兴!


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
        }
    }

0

万一有人真的需要这样的封闭,可以通过以下方式完成:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.