2014-09-13 10 views
13

w Objective-C, można określić typ jako danej klasie i wdrożenie protokołu:Swift: typ musi wdrożyć protokół i być podklasę danej klasy

- (UIView <Protocol> *)someMethod; 

to powie, że wartości zwrócony przez someMethod był UIView implementujący dany protokół Protocol. Czy istnieje sposób na wymuszenie czegoś podobnego w Swift?

+3

Podobne pytanie tutaj: http://stackoverflow.com/questions/25767156/swift-property-conforming-to-a-specific-class-and-in-the-same-time-to-multiple?rq=1 –

+0

podobnie jak tutaj http://stackoverflow.com/questions/26401778/swift-how-can-i-declare-a-charakter--specific-type-that-conforms-to-one-or-m –

Odpowiedz

10

Można to zrobić tak:

protocol SomeProtocol { 
    func someMethodInSomeProtocol() 
} 

class SomeType { } 

class SomeOtherType: SomeType, SomeProtocol { 
    func someMethodInSomeProtocol() { } 
} 

class SomeOtherOtherType: SomeType, SomeProtocol { 
    func someMethodInSomeProtocol() { } 
} 

func someMethod<T: SomeType where T: SomeProtocol>(condition: Bool) -> T { 
    var someVar : T 
    if (condition) { 
    someVar = SomeOtherType() as T 
    } 
    else { 
    someVar = SomeOtherOtherType() as T 
    } 

    someVar.someMethodInSomeProtocol() 
    return someVar as T 
} 

ten definiuje funkcję, która zwraca obiekt typu „SomeType” i certyfikatem „SomeProtocol” i zwraca obiekt, który przylega do tych warunków.

+0

Dzięki. W takim przypadku, w niektórych Metod, jeśli robię: 'var v: T; v = MyView() ', pojawia się błąd 'MyView nie jest konwertowalny na T', mimo że MyView jest' klasą MyView: UILabel, Protocol'. – Kamchatka

+0

Jeśli dodasz "jako T" do końca zwrotu, działa. Zaktualizuję odpowiedź. – ColGraff

+0

Dzięki, to lepiej. Nadal mam następujący problem w implementacji metody: 'func someMethod () -> T { var someVar: T someVar.someMethodInSomeProtocol() <- ERROR" T nie mieć członka o nazwie "someMethodInSomeProtocol" return someVar jako T } ' – Kamchatka

Powiązane problemy