Powiedzmy Stworzyłem ten protokół i kilka klasZadeklaruj tablicę klas, które są zgodne z protokołem
import UIKit
protocol ControllerConstructorProtocol {
class func construct() -> UIViewController?
}
class MyConstructor: ControllerConstructorProtocol {
class func construct() -> UIViewController? {
return UIViewController()
}
}
class MyOtherConstructor: ControllerConstructorProtocol {
class func construct() -> UIViewController? {
return UITableViewController(style: .Grouped)
}
}
Teraz chcę zadeklarować tablicę, która zawiera klasy obiektów, które będą zgodne z takiego protokołu. Jak mogę to zgłosić? Idealnie chciałbym, aby kompilator sprawdził, czy tablica jest poprawnie wypełniona (podczas kompilacji), zamiast sprawdzać ją w (czasie pracy) z operatorem as
.
To co próbowałem bezskutecznie :(
Prowadzi to do błędu kompilacji:
'Any Object does not have a member named 'construct'
var array = [ MyConstructor.self, MyOtherConstructor.self, ] var controller = array[0].construct() // << ERROR here
Zapis ten jest jeszcze gorzej, ponieważ sama klasa robi niezgodny z protokołem (ich wystąpienia)
Type 'MyConstructor.Type' does not conform to protocol 'ControllerConstructorProtocol'
var array: Array<ControllerConstructorProtocol> = [ MyConstructor.self, // << ERROR here MyOtherConstructor.self, ]
EDIT 23.04.2016 W Swift 2.2 (Xcode 7.3) możliwe jest napisać @rintaro's original idea :)
let array: Array<ControllerConstructorProtocol.Type> = [
MyConstructor.self,
MyOtherConstructor.self,
]
let viewController = array[0].construct()
Rozumiem. Tak więc "niezatwierdzeni" twórcy szybkich kompilatorów wciąż pracują nad poprawką. W tej chwili nie ma rozwiązania bez słowa kluczowego "as". – nacho4d
Tak, wierzę, że jabłko nad tym pracuje. Uaktualniłem odpowiedź, ale uważam, że nie ma prostej metody rozwiązania tego problemu. – rintaro
Teraz o tym wspomniałeś, posiadanie szeregu zamknięć jest dla mnie wystarczające! 2 り が と う ご ざ い ま し た! – nacho4d