【问题标题】:Swift - Refer to current class type in a static / class functionSwift - 在静态/类函数中引用当前类类型
【发布时间】:2016-12-30 14:59:26
【问题描述】:

我有静态函数来实例化看起来像的视图控制器

class AController: UIViewController {
  static func instantiate() -> AController {
    let storyboard = UIStoryboard(name: "AController", bundle: nil)
    let controller = s.instantiateInitialViewController() as? AController
    return controller!
  }
}

class BController: UIViewController {
  static func instantiate() -> BController {
    let storyboard = UIStoryboard(name: "BController", bundle: nil)
    let controller = storyboard.instantiateInitialViewController() as? BController
    return controller!
  }
}

我有一堆,所以我想把它们弄得更干净:

class MYViewController: UIViewController {
  class func instantiate() -> self.type {
    let storyboard = UIStoryboard(name: "\(self.type)", bundle: nil)
    let controller = storyboard.instantiateInitialViewController() as? self.type
    return controller!
  }
}

class AController: MYViewController {
}

class BController: MYViewController {
}

但我不知道在静态/类函数中动态引用对象的类型,以及如何在从子类调用时让 this 引用子类。一旦使用type(of: object) 实例化了一个对象,就很容易做到

【问题讨论】:

标签: swift class static subclass instantiation


【解决方案1】:

试试这个:

class MYViewController: UIViewController {
    class func instantiate() -> Self {
        let storyboard = UIStoryboard(name: "\(self)", bundle: nil)
        let controller = storyboard.instantiateInitialViewController() as! Self
        return controller
    }
}

我不能 100% 确定它是否有效,因为我没有直接测试您的代码(不想创建一个故事板只是为了测试),但我编写了类似的代码来测试它,它有效:

class MYViewController: UIViewController {
    class func instantiate() -> Self {
        print("type: \(self)")
        return self.init()
    }
}

【讨论】:

  • 这在我的 Xcode 8.2.1 中无法编译:'Self' is only available in a protocol or as the result of a method in a class; did you mean 'MYViewController'?cannot convert return expression of type 'MYViewController' to return type 'Self'
  • 奇怪的是在 8.2.1 中为我编译。我的确切版本是 8C1002
  • 这很奇怪,我在一个新项目中再次签入。第二个代码块编译,但不是第一个。
  • @MartinR:你说得对,storyboard.instantiateInitialViewController() as! Self 部分也不适合我编译。您链接到的问题的答案(stackoverflow.com/questions/33200035/…)解释了另一种解决方案(基本上,使用泛型)。老实说,我昨天写答案时无法解释为什么它会起作用,尽管我可以发誓我在操场上写了这个确切的代码并从那里粘贴它(我唯一没有做的就是用故事板运行它; 可能是操场卡住了)。对不起。
  • @OleBegemann 也许你有类似的东西typealias `Self` = MYViewController
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多