gpt4 book ai didi

ios - UIStoryboard 扩展

转载 作者:行者123 更新时间:2023-11-29 01:03:51 25 4
gpt4 key购买 nike

我正在尝试快速创建 Storyboard扩展,以便更安全地实例化 View Controller

protocol IdentifierType {
typealias Identifier: RawRepresentable
}

extension IdentifierType where Self: UIStoryboard, Identifier.RawValue == String {

func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController {
return self.instantiateViewControllerWithIdentifier(identifier.rawValue)
}

}

而且编译时不会出错。但是,当我尝试像这样实现它时:

extension UIStoryboard : IdentifierType {
enum Identifier: String {
case MainViewController = "MAIN_VIEW_CONTROLLER"
case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER"
case AboutViewController = "ABOUT_VIEW_CONTROLLER"
}
}

发生编译时错误。 “‘标识符’在这种情况下对于类型查找是模糊的”

最佳答案

你可以这样说:

protocol IdentifierType {
associatedtype Identifier: RawRepresentable
}

extension UIStoryboard : IdentifierType {
enum Identifier: String {
case MainViewController = "MAIN_VIEW_CONTROLLER"
case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER"
case AboutViewController = "ABOUT_VIEW_CONTROLLER"
}

func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController {
return self.instantiateViewControllerWithIdentifier(identifier.rawValue)
}
}

然后您可以调用类似 self.storyboard?.instantiateViewControllerWithIdentifier(.ContactUsViewController) 的内容,这就是您想要的。

不确定在这种情况下使用 RawRepresentable 有什么好处,也许您可​​以解释为什么您认为需要使用它。

但假设这就是您所需要的一切,则完全不需要协议(protocol) IdentifierType,因此您可以简化为:

extension UIStoryboard  {
enum Identifier: String {
case MainViewController = "MAIN_VIEW_CONTROLLER"
case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER"
case AboutViewController = "ABOUT_VIEW_CONTROLLER"
}

func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController {
return self.instantiateViewControllerWithIdentifier(identifier.rawValue)
}
}

您可以在 swift here 中找到有关使用枚举删除硬编码字符串的讨论和 here.

关于ios - UIStoryboard 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664870/

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