当前位置: 首页 > 面试题库 >

在Swift中返回实例类型

景育
2023-03-14
问题内容

我正在尝试进行此扩展:

extension UIViewController
{
    class func initialize(storyboardName: String, storyboardId: String) -> Self
    {
        let storyboad = UIStoryboard(name: storyboardName, bundle: nil)
        let controller = storyboad.instantiateViewControllerWithIdentifier(storyboardId) as! Self

        return controller
    }
}

但是我得到了编译错误:

错误:无法将类型’UIViewController’的返回表达式转换为类型’Self’

可能吗?我也想做到init(storyboardName: String, storyboardId: String)


问题答案:

与在Swift的类扩展函数中使用’self’类似,您可以定义一个通用的辅助方法,该方法可以从调用上下文中推断出self的类型:

extension UIViewController
{
    class func instantiateFromStoryboard(storyboardName: String, storyboardId: String) -> Self
    {
        return instantiateFromStoryboardHelper(storyboardName, storyboardId: storyboardId)
    }

    private class func instantiateFromStoryboardHelper<T>(storyboardName: String, storyboardId: String) -> T
    {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        let controller = storyboard.instantiateViewControllerWithIdentifier(storyboardId) as! T
        return controller
    }
}

然后

let vc = MyViewController.instantiateFromStoryboard("name", storyboardId: "id")

进行编译,并将类型推断为MyViewController

Swift 3 更新

extension UIViewController
{
    class func instantiateFromStoryboard(storyboardName: String, storyboardId: String) -> Self
    {
        return instantiateFromStoryboardHelper(storyboardName: storyboardName, storyboardId: storyboardId)
    }

    private class func instantiateFromStoryboardHelper<T>(storyboardName: String, storyboardId: String) -> T
    {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: storyboardId) as! T
        return controller
    }
}

另一种可能的解决方案,使用unsafeDowncast

extension UIViewController
{
    class func instantiateFromStoryboard(storyboardName: String, storyboardId: String) -> Self
    {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: storyboardId)
        return unsafeDowncast(controller, to: self)
    }
}


 类似资料:
  • 我的接口定义为: 然而,这还不够明确,因为我不知道返回的是什么字段。我想要像这样的东西: 但是这会引发NameError,因为还没有定义结果类。是否有任何方法可以指定函数的返回类型(以便内部成员可以通过点运算符访问),而无需为每个函数显式创建结果类? EDIT我没有在他们自己的模块中进行定义,因为我认为会有太多名字尴尬冗长的模块。定义一个内部类会更好,因为它不会每次都强制创建一个新的类名,而且,因

  • 本文向大家介绍Swift函数提前返回实例详解,包括了Swift函数提前返回实例详解的使用技巧和注意事项,需要的朋友参考一下 简评: 函数是一个组织在一起语句集合,以执行特定任务。Swift 函数类似于简单 C 函数以及复杂的 Objective C 语言函数。 它使我们能够通过函数调用内部的局部和全局参数值。 像其他任何语言一样 swift 函数也遵循相同的步骤。 函数声明:它告诉编译器有关的函数

  • 问题内容: 根据Xcode发行说明,Apple一直在“审核”其现有的API,以删除隐式解包的可选控件。这意味着它们的API会代替或在适当的地方返回。 他们在哪里做?如何注释/包装现有的Objective-C代码(尤其是库),以使其更易于在Swift中使用? 问题答案: Xcode 6.3 / Swift 1.2 Xcode 6.3增加了对在Objective-C中注释可空性的官方支持。 可空性 值

  • 是否可以自动创建返回的setter? 尝试了以下操作,但这样它不起作用,但是这个例子显示了我想要实现的目标: 手动解决方案 编写coure的<code>setter</code>和<code>getter</code>我自己,如下所示: 问题 这个过程可以用kotlin自动化吗?有什么办法可以做到这一点吗?

  • 本文向大家介绍PowerShell函数指定返回值类型实例,包括了PowerShell函数指定返回值类型实例的使用技巧和注意事项,需要的朋友参考一下 本文介绍在自定义PowerShell函数时,如何设置返回值的数据类型。PowerShell函数的返回值可以有类型,也可以没有类型,跟输入参数相似。     定义PowerShell函数的返回值类型,要使用OutputType这个指令。将这个指令放到pa