这里出了啥问题:实例成员不能用于类型 [重复]

Posted

技术标签:

【中文标题】这里出了啥问题:实例成员不能用于类型 [重复]【英文标题】:What's wrong here: Instance member cannot be used on type [duplicate]这里出了什么问题:实例成员不能用于类型 [重复] 【发布时间】:2015-09-21 10:38:55 【问题描述】:

我有以下代码,但我对这个错误消息感到困惑:

实例成员“mydate”不能用于类型“TableViewController”

代码:

class TableViewController: UITableViewController     
    let mydate = NSDate()
    let items = [
        (1, 9, 7, "A", mydate),
        (2, 9, 7, "B", mydate),
        (3, 9, 7, "C", mydate),
        (4, 9, 7, "D", mydate)
    ]

当我编写以下内容时,我可以构建它,但我不知道为什么 oder sn-p 不起作用:

class TableViewController: UITableViewController     
    let mydate = NSDate()
    let items = [
        (1, 9, 7, "A", nil),
        (2, 9, 7, "B", mydate),
        (3, 9, 7, "C", mydate),
        (4, 9, 7, "D", mydate)
    ]

【问题讨论】:

我遇到了同样的事情。你最干净的选择是在类中定义它们,但在你的 viewDidLoad() 函数中填充它们。这将允许您嵌套所有您想要的内容,而不会出现这些烦人的编译错误。 @MarkLöwe,这不是“最干净的解决方案”。并且这些编译器错误是有效的并且与语言的设计一致。最干净的解决方案是这里写的解决方案。在viewDidLoad 中初始化可能在非基于视图控制器的类中甚至是不可能的。我们不要用可笑的 cmets 误导人们。 内部静态变量 mydate : NSDate;内部静态变量项;这是解决此问题的简单方法 【参考方案1】:

这里的问题是你在类完全初始化之前使用self。您可以有一个 getter,每次访问变量时都会调用它,也可以懒惰地计算它。

这里有一些代码:

class TableViewController: UITableViewController 
    let mydate = NSDate()
    var items : [(Int,Int,Int,String,NSDate)] 
        get 
            return [
                (1, 9, 7, "A", mydate),
                (2, 9, 7, "B", mydate),
                (3, 9, 7, "C", mydate),
                (4, 9, 7, "D", mydate)
            ]

        
    

惰性计算:

class TableViewController: UITableViewController 
    let mydate = NSDate()
    lazy var items : [(Int,Int,Int,String,NSDate)] =  

            return [
                (1, 9, 7, "A", self.mydate),
                (2, 9, 7, "B", self.mydate),
                (3, 9, 7, "C", self.mydate),
                (4, 9, 7, "D", self.mydate)
            ]


    ()

【讨论】:

你能举个例子吗? 你去。这行得通。 @AboveTheGods 别再这么卑鄙了 @rockyraccoon,有时候,最好的做法就是点头微笑。 :)【参考方案2】:

您可以使用此代码

var items:Array<(Int, Int, Int, String, NSDate)> 
        get 
            return [
                (1, 9, 7, "A", mydate),
                (2, 9, 7, "B", mydate),
                (3, 9, 7, "C", mydate),
                (4, 9, 7, "D", mydate)
            ]
        
    

【讨论】:

【参考方案3】:

编译器会感到困惑,因为它不知道可选NSDate 的类型。你可以让它明确地知道类型。

let items : Array<(Int, Int, Int, String, NSDate?)> = [
    (1, 9, 7, "A", nil),
    (2, 9, 7, "B", mydate),
    (3, 9, 7, "C", mydate),
    (4, 9, 7, "D", mydate)
]

编辑:对于使用实例变量的问题,您可以使用闭包来初始化您的项目。

let items : Array<(Int, Int, Int, String, NSDate?)> = 
    let mydate = NSDate()
    return [
        (1, 9, 7, "A", nil),
        (2, 9, 7, "B", mydate),
        (3, 9, 7, "C", mydate),
        (4, 9, 7, "D", mydate)
    ]
    ()

【讨论】:

此修复程序仍然出现错误

以上是关于这里出了啥问题:实例成员不能用于类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

静态成员“负载”不能用于“AppDelegate”类型的实例

实例成员不能用于 struct swift 之间的嵌套类型的实例

实例成员 'count' 不能用于类型 'TweetFilterOptions.AllCases'

实例成员不能用于类型视图控制器

实例成员“可达性”不能用于“CMNetworkManager”类型

实例成员不能用于类型 - 错误