2016-12-30 39 views
2

我已经静态函数实例化,看起来像斯威夫特 - 指的是当前类类型的静态/类功能

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 { 
} 

但我不知道的动态参考对象的类型在静态/类功能,以及如何有此指的是从子类的子类调用时。这很容易做到一旦对象已经被实例化type(of: object)

+0

见http://stackoverflow.com/questions/33200035/return-instancetype-in​​-swift的可能解决方案(但如果给定的答案有效,那么这将是一个更简单的解决方案)。 –

回答

0

试试这个:

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() 
    } 
} 
+0

这是非常好的,谢谢 – Guig

+0

这不会在我的Xcode 8.2.1中编译:''Self'只能在协议中或作为类中方法的结果;你的意思是'MYViewController'吗?'和'不能将类型'MYViewController'的返回表达式转换为返回类型'Self'' –

+0

奇怪的是,它在8.2.1中为我编译。我的确切版本是8C1002 – Guig