【问题标题】:Cannot assign to the result of this expression when setting table view's dataSource设置表视图的数据源时无法分配给此表达式的结果
【发布时间】:2014-06-18 13:31:23
【问题描述】:

我想在我的 Cocoa 应用程序中使用NSTableView,因此我必须将表视图的NSTableViewDataSource 委托设置为self。但是,由于错误Cannot assign to the result of this expression,以下代码无法编译。

myTable.dataSource = self

我确实像这样声明了myTable 变量:

@IBOutlet var myTable: NSTableView

另请注意,我正确声明我的 AppDelegate 符合 NSTableViewDataSource 协议。

那么上面两行有什么问题呢?

另外,我将表格视图声明为@IBOutlet var myTable: NSTableView 是否正确?或者我应该将其定义为可选变量还是隐式展开的可选变量?

【问题讨论】:

  • Err 为什么投反对票???
  • 你在哪里分配myTable.dataSource = self?在self尚未初始化的几个位置,您无法访问self
  • 另外,您当前的声明是正确的,@IBOutlet 隐含地使您的变量成为 implicitly unwrapped optional
  • 我在awakeFromNib() 中分配了它,这是我现在正在阅读的一本书所做的(尽管它使用的是Objective-C 和Xcode 4,而不是Swift 和Xcode 6 beta)...
  • 顺便说一句,当我将代码移到awakeFromNib()之外时,错误消息变为Expected declaration,代码仍然无法编译。

标签: cocoa swift


【解决方案1】:

看起来NSTableView 似乎还没有完全现代化。它的dataSource 属性仍然是非正式的,仅作为访问器方法存在,而不是使用@property 声明的属性。因此,Swift 接口没有dataSource 属性。它有dataSource()和setDataSource()这两个方法。

那么,试试吧:

myTable.setDataSource(self)

【讨论】:

  • 太棒了!这解决了问题,现在构建成功。谢谢。
  • 不客气。顺便说一句,您应该向 Apple 提交错误,以便有机会在短期内得到修复。
【解决方案2】:

IBOutlet 属性被自动设为弱隐式解包选项,初始设置为 nil。

您可以使用 if let 安全地直接访问该值:

if let table = myTable{
    table.dataSource = self
}

【讨论】:

  • 我在发布此问题之前尝试过,但它仍然返回相同的错误消息...
  • Cannot assign to 'dataSource' in 'table' 当我写table.dataSource = self 时,而Cannot assign to the result of this expression 当我写myTable.dataSource = self 时,都在if 语句的正文中。
  • 你自己实现数据源协议了吗?
  • 我确实将其声明为class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate, NSTableViewDataSource { ... }
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多