Jeśli zawsze chcesz tablicę typu AnyObject trzeba określić go w swojej klasie:
class Bar: Parent {
var children = [AnyObject]()
init() {}
}
ale jeśli możesz użyj bardziej szczegółowego protokołu z typealias
możesz przepisać protokół jak:
protocol Parent {
// in Swift 1 and 2: use `typealias` instead of `associatedtype`
associatedtype T: AnyObject // this makes sure that all instances in the array are definitely of type `AnyObject`/classes
var children: [T] { get set }
}
ten sposób Państwa byłego zgodności swoich prac klasowych, ale trzeba wziąć pod uwagę, że protokół ten może być stosowany jedynie jako ogólny przymusu, a więc tylko w funkcji i ogólnych deklaracji:
// --- this does work
func someFunc<T: Parent, U: Parent>(p1: T, p2: U) { /* ... */ }
class SomeClass<T: Parent> { /* ... */ }
// --- this doesn't work
let parent: Parent
let array: [Parent]
// here you can only use types which conform to the protocol
// but not the protocol itself as generic arguments
let something = SomeClass<Parent>()
Dokładnie to, czego potrzebowałem. Jestem fanem sprawdzania typów w Swift, ale czasami zmusza cię to do stworzenia mnóstwa kodu. Mam wiele zajęć w moim oprogramowaniu i muszę osobno sprawdzić każdy z nich, gdy wszystkie mają gwarancję, że ta sama właściwość może być frustrująca. – MAH
@MAH Można również użyć protokołów, aby zapewnić wspólną funkcjonalność obiektów. Jeśli 'Dziecko' jest protokołem, to' var children: [Dziecko] 'może być spełnione przez dowolną tablicę elementów, które są zgodne z' Child'. Możesz uogólniać funkcjonalność i unikać sprawdzania spraw oddzielnie! – jtbandes
Programowanie oparte na protokole (https://developer.apple.com/videos/wwdc/2015/?id=408) jest warte obejrzenia. – jtbandes