gpt4 book ai didi

swift - 为什么我不能访问这个符合协议(protocol)的 destinationViewController 的属性?

转载 作者:行者123 更新时间:2023-11-28 06:23:54 24 4
gpt4 key购买 nike

我试图在我的 prepareForSegue 方法中将一个 NSManagedObjectContext 从一个 View Controller 传递到下一个 View Controller ,但我无法访问我为它创建的属性在 destinationViewController 中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
switch identifier {
case "segueToSettings", "pickLiftSegue":
if let nav = segue.destinationViewController as? UINavigationController {
let vc = nav.topViewController as! Dismissable
vc.dismissalDelegate = self

let context = viewModel.model.context
vc.moc = context // <-- Value of type Dismissable has no member `moc`
}
case "segueToLog":
let destinationVC = segue.destinationViewController as? Dismissable

destinationVC?.dismissalDelegate = self
default:
break
}
}
}

下面是 destinationViewController 的相关部分:

class SettingsViewController: UITableViewController, Dismissable, DismissalDelegateProtocol {

@IBOutlet weak var forumlasTitle: UILabel!
@IBOutlet weak var liftsTitle: UILabel!
@IBOutlet weak var weightUnitControl: UISegmentedControl!
@IBOutlet weak var roundNumbersSwitch: UISwitch!
@IBOutlet weak var currentFormulaSelection: UITableViewCell!
@IBOutlet weak var currentLiftsSelection: UITableViewCell!

var dismissalDelegate: DismissalDelegateProtocol?
var moc: NSManagedObjectContext? = nil // <-- There it is right there
}

我在 prepareForSeguevc.moc 上看到上面的错误,这清楚地表明符合 Dismassable 协议(protocol)的 View Controller 没有名为 moc 的属性,这是真的:

protocol Dismissable: class {
weak var dismissalDelegate: DismissalDelegateProtocol? { get set }
}

但我不应该能够访问 View Controller 本身的属性而不使其成为协议(protocol)的一部分吗?

我已经搜索了很长时间并梳理了 Apple's Protocol documentation但我还没有找到答案。我以为我已经很好地掌握了协议(protocol),但似乎我仍然缺少一两个关键概念。

最佳答案

问题是编译器只知道你告诉它什么。你说:

let vc = nav.topViewController as! Dismissable

现在 vc 是一个 Dismissable,这是编译器知道的全部。并且 Dismissable 没有 moc 属性。因此,当您尝试讨论 Dismissable 的 moc 属性时,编译器会阻止您。

但是 SettingsViewController 确实有一个 moc 属性,正如您自己正确指出的那样。所以告诉编译器这一个SettingsViewController,如果它是:

if let svc = vc as? SettingsViewController {
svc.moc = context
}

但是再想一想。由于 SettingsViewController 一个 Dismissable,并且编译器知道这一点,这实际上是您需要的唯一转换,因为现在您还可以访问可忽略的属性。因此您的代码可以完全重写:

    if let nav = segue.destinationViewController as? UINavigationController {
if let vc = nav.topViewController as? SettingsViewController {
vc.dismissalDelegate = self // fine, because a SVC is a Dismissable
let context = viewModel.model.context
vc.moc = context // fine, because a SVC is a SVC :)
}
}

换句话说,这样看:编译器知道 SettingsViewController 是 Dismissable。但是没有法律规定每个 Dismissable 都是一个 SettingsViewController。您的原始代码有倒退的关系,仅此而已。

关于swift - 为什么我不能访问这个符合协议(protocol)的 destinationViewController 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42583424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com