【问题标题】:Instance member cannot be used on type实例成员不能用于类型
【发布时间】:2015-11-27 20:30:57
【问题描述】:

我有以下课程:

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

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

实例成员“categoriesPerPage”不能用于类型 '报告视图'

这是什么意思?

【问题讨论】:

  • 猜你要声明一个计算属性numPages而不是一个闭包删除等号:var numPages: Int { return categoriesPerPage.count }
  • 能否更彻底地解释此错误消息的确切含义?我在完全不同的背景下看到它。
  • 当你在类范围内声明一个块时,就像上面一样,你受限于类型中可用的内容。您无权访问任何实例成员。
  • 注意:错误信息与您尝试create a lazy variable but forgot one of the requirements 时收到的类似。在您的情况下,您不需要惰性变量,因为 categoriesPerPage 被定义为 var 而不是 let
  • Remove = from: var numPages: Int =

标签: swift instantiation getter-setter computed-properties


【解决方案1】:

= {return self.someValue} 时出现语法错误。不需要=

使用:

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

}

如果你想get only你可以写

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,这是一个二维数组,v是Int?
  • @Dan Your'e 对,这个例子只是为了演示set的例子,当然你不能把int赋值给[int]
  • 这样做了一百万次,仍然错过了额外的 = 符号:)
  • 你不需要分号 fam
【解决方案2】:

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

【讨论】:

  • 啊,谢谢!花了很长时间弄清楚为什么我在 Xcode 中没有得到任何实例成员自动完成建议。这似乎是一个错误,我会向 Apple 提交雷达 ??
  • 自动完成也搞砸了我。这对我来说也像是一个错误。
  • 这其实不是bug。 XCTesCase 类同时具有套件级的拆解方法“open class func tearDown()”和实例方法“open func tearDown()”。它们都可以自动完成。
【解决方案3】:

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

例如。

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

instanceOfMyClass.variable = 'Foo' // Right!

【讨论】:

  • 这是static变量和instance变量之间的区别,MyClass.variable是有效的,如果你将它声明为静态变量(在所有实例之间共享)
  • 这是我的问题。当 XCode 决定将类放在自动完成选项中的第一个类似名称的实例之前,当上下文似乎指向我肯定使用实例而不是类本身时,我觉得有点奇怪。在您的实例仅因情况而异的情况下,很难注意到您选择了类而不是您想要的实例。谢谢!
【解决方案4】:

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

您可以通过添加静态/类属性使您的实例变量成为类变量。

您实例化您的类的一个实例并调用该变量的实例方法。

【讨论】:

  • 在我的例子中,我尝试在另一个类的实例被初始化后调用的完成块中使用一个实例变量。当然,init 是一个类函数,将实例变量声明为 static 解决了这个问题。
【解决方案5】:

另一个例子是,你有这样的类:

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

这是因为您为您的方法分配了“类”关键字(这使您的方法成为类型方法)并使用了类似:

Album.getCurrentlyPlayingSongLyric(duration: 5)

但是之前谁设置了playingSong 变量?好的。你不应该在这种情况下使用 class 关键字:

 // ...

 func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
        // ...
       return playingSong.lyric
 }

 // ...

现在你可以走了。

【讨论】:

    【解决方案6】:

    您最初的问题是:

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

    现在编译器很高兴!

    【讨论】:

      【解决方案7】:

      尽管创建了变量static,但我一直收到同样的错误。 解决方案:清理构建,清理派生数据,重新启动 Xcode。或捷径 Cmd + Shift+Alt+K

      UserNotificationCenterWrapper.delegate = self
      
      public static var delegate: UNUserNotificationCenterDelegate? {
              get {
                  return UNUserNotificationCenter.current().delegate
              }
              set {
                  UNUserNotificationCenter.current().delegate = newValue
              }
          }
      

      【讨论】:

        【解决方案8】:

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

        var categoriesPerPage = [[Int]]()
        var numPagesClosure: ()->Int {
            return {
                return self.categoriesPerPage.count
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-23
          • 2016-01-01
          • 2016-09-09
          • 2020-01-16
          • 2017-06-25
          • 2016-07-05
          • 2017-01-25
          • 2019-02-15
          相关资源
          最近更新 更多