Swift - 在静态/类函数中引用当前类类型

Gui*_*uig 5 static class subclass instantiation swift

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

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!
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一堆,所以我想让它更干净:

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 {
}
Run Code Online (Sandbox Code Playgroud)

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

Ole*_*ann 1

尝试这个:

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

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

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