2014-10-09 10 views
8

Jestem nowy w Swift. Mam klasy bazowej:Jak podklasować klasę tablicową w Swift?

class foo{} 

Chcę zaimplementować klasę kolekcji foo:

class foos: Array<foo>{} 

Ale kompilator narzeka:

dziedziczenie z nieprzestrzegania protokołu, nie- typ klasy 'Array'

Próbowałem innej składni (np. [foo] i NSMutableArray<foo>), ale żaden z nich nie przechodzi testu kompilatora.

To powinno być proste, ale mam googled cały dzień i nie mogłem go rozwiązać. Czy ktokolwiek wie, czy jest to możliwe, a jeśli tak, to czy poprawna składnia?

Odpowiedz

12

Swift Array typu jest struktura i Swift, klasy bazowa musi być rzeczywiście klasy (tzn class Foo), a nie struktury.

Nie można zrobić niestety tego, co próbujesz, przez dziedziczenie z Array. Można jednak przechowywać tablicę jako pole wewnątrz klasy i przekazywać do niej metody, ewentualnie implementując dowolne protokoły, które mają być obsługiwane, i tak dalej.

+0

Dzięki, Josh. Nie zdawałem sobie sprawy, że Array jest strukturą. Szkoda, że ​​nie mogłem zrobić tego, czego chcę, ale to, co sugerujesz, jest najlepsze, co mogę zrobić (A ma B zamiast A jest B). – Alex

+0

Chociaż i tak jest to niemożliwe ... Ogólnie rzecz biorąc, istnieje wiele powodów, dla których warto preferować kompozycję do dziedziczenia, zwłaszcza gdy nie masz własnej klasy bazowej. http://pl.wikipedia.org/wiki/Composition_over_inheritance#Benefits –

3

W Swift, Array jest strukturą, a nie klasą. Aby mieć klasę, która jest podklasą tablicy, będziesz musiał użyć NSArray, swojego odpowiednika w Objective-C.

Przykładowo

class Foo: NSArray{} 
+0

Dziękuję erdekhayser. Chcę typowy typ i NSArray nie jest typem ogólnym. – Alex

+0

Jak na ironię, NSArray jest tak naprawdę generyczny jak ostatnio. – erdekhayser

2

W Swift 2.x można użyć rozszerzenia protokołu.

class Foo : Equatable {} 
// you need to provide the Equatable functionality 
func ==(leftFoo: Foo, rightFoo: Foo) -> Bool { 
    return ObjectIdentifier(leftFoo) == ObjectIdentifier(rightFoo) 
} 

extension Array where Element : Foo {} 

rozszerzenia protokołu zapewnić „insert punkty” przedłużyć klas, które nie mają zajęcia, zajęcia nie są właścicielami, itp

+1

to całkiem proste ... – slboat

Powiązane problemy