2016-12-30 11 views
2

Я статические функции создания экземпляров контроллеров отображения, которые выглядят как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! 
    } 
} 

Я кучу из них, так что я хотел бы сделать, что уборщик как:

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