swift - 无法使用协议(protocol) : destination is a 'let' constant 在 segue 中传递值

标签 swift core-data

当我浏览我的应用程序时,我试图将我的 NSManagedObjectContext 传递给我的 child ViewControllers(即依赖注入(inject))

我创建了一个协议(protocol) ManagedObjectContextDependent

protocol ManagedObjectContextDependent {
    var managedObjectContext: NSManagedObjectContext! { get set }
}

我的自定义 ViewControllers 采用该协议(protocol)。例如:

class MyTableViewController: UITableViewController, ManagedObjectContextDependent {
    var managedObjectContext: NSManagedObjectContext!
}

然后在 prepareForSeqgue 上我传递它。这很好用。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? MyTableViewController {
            destinationVC.managedObjectContext = self.managedObjectContext
        }
 }

但是如果我尝试将目标转换为 ManagedObjectContextDependent,我不能:

无法分配给属性:“destinationVC”是一个“let”常量

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? ManagedObjectContextDependent {
            destinationVC.managedObjectContext = self.managedObjectContext
        }
}

我正在尝试重构此代码以使其通用——任何两个 ManagedObjectDependent 类都可以传递一个 segue

最佳答案

除非您将协议(protocol)声明为 class 协议(protocol),否则 Swift 假定它可能由 structenum 实现。在这些情况下,不能修改用 let 赋值的变量。

要解决此问题,请将 class 添加到您的 protocol 声明中:

protocol ManagedObjectContextDependent: class {
    var managedObjectContext: NSManagedObjectContext! { get set }
}

关于swift - 无法使用协议(protocol) : destination is a 'let' constant 在 segue 中传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767159/

相关文章:

iphone - 我应该在哪里将 iPhone View 中的 "save"更改为对象的 'create new'?

core-data - 为 CoreData 生成的类添加前缀

ios - 是否可以延迟加载符合 nscoding 协议(protocol)的对象

objective-c - NRGridView 不会显示来 self 的核心数据数据库的数据

ios - 点播资源上传失败

Swift Storyboard错误

ios - 编辑 UIButton 使其一侧有圆角

swift - 无法向 SKShapeNode 子类添加便利初始化程序

ios - SwiftUI 或 Beta-State 导致崩溃?

objective-c - 在 0 : 8/attempt to write a readonly database 之后意外无法执行 BEGIN IMMEDIATE