gpt4 book ai didi

ios - 通用 View Controller 的条件转换失败

转载 作者:行者123 更新时间:2023-11-30 12:11:59 26 4
gpt4 key购买 nike

假设我有以下内容:

class ContentSelectableViewController<T: NSManagedObject> : UIViewController { //... }

class PersonSelectionViewController: ContentSelectableViewController<Person> { // ... }

class PlaceSelectionViewController: ContentSelectableViewController<Place> { // ... }

然后在这些子类之一的实例中,我有一些代码:

if let navCtrl = self.navigationController {


for viewController in navCtrl.viewControllers.reversed() {

if viewController is ContentSelectableViewController {
log.info("Worked for \(viewController.description)")
}

if let vc = viewController as? ContentSelectableViewController {
// This should be equivalent to the above.
}
}
}

我的问题是,当我有一个充满此通用基类的子类的堆栈时,在检查它们是否为 ContentSelectableViewController 类型时,它并不总是返回 true(进入 if 语句)并且我不明白为什么。它们继承自同一个基类。

编辑:

我猜这是因为该类的通用性质。对于调用它的子类,if 语句的计算结果为 true。

最佳答案

所以,它实际上确实与尝试对泛型类进行类型检查有关。它适用于其中一个而不是另一个,因为进行调用的那个会隐式添加其类型。

即(伪 Swift)

if viewController is ContentSelectableViewController<Person> { //... }

我所做的是定义一个协议(protocol),最终使这些 ContentSelectableViewController<T>可选:

enum ContentSelectionRole: Int {
case none = 0 // no selection going on right now.
case root // i.e. the one wanting content
case branch // an intermediary. think of a folder when looking for a file
case leaf // like a file
}

enum ContentSelectability: Int {
case noSelections = 0
case oneSelection = 1
case multipleSelections = 2
}

protocol ContentSelection {

var selectedObjects: [NSManagedObject] { get set }
var selectionRole: ContentSelectionRole { get set }
var selectionStyle: ContentSelectability { get set }
func popToSelectionRootViewController() -> Bool
func willNavigateBack(from viewController: UIViewController)
}

做出定义:

class ContentSelectableViewController<T: NSManagedObject> : UIViewController, ContentSelection { //... }

然后,重构原来的帖子,得到:

@discardableResult func popToSelectionRootViewController() -> Bool {

if let navCtrl = self.navigationController {

for viewController in navCtrl.viewControllers.reversed() {

if let vc = viewController as? ContentSelection {
if vc.selectionRole == .root {

vc.willNavigateBack(from: self)
navCtrl.popToViewController(viewController, animated: true)
return true
}
}
}
}

return false
}

我仍然不太明白导致它失败的语言方面,但这个解决方案是有效的。

无论如何,基于协议(protocol)的编程似乎更加 Swifty...

关于ios - 通用 View Controller 的条件转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45939123/

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