2016-09-27 6 views
3

私はそれに従うプロトコルと2つのクラスを作成しようとしています。プロトコルには、別のプロトコルに準拠するプロパティがあり、クラスには一致するプロパティが必要です。プロトコルタイプのプロパティを宣言するプロトコルに準拠するにはどうすればよいですか?

これは私がこれまでにしようとしているものを(のようなもの)である:

protocol Edible { 
    func eat() 
} 

class Apple:Edible { 
    func eat() { 
     print("Crunch") 
    } 
} 

class Banana:Edible { 
    func eat() { 
     print("Homph") 
    } 
} 

protocol Delicious { 
    func consume() 

    var fruit: Edible? { get set } 
}  

class ToffeeApple: Delicious { 
    func consume() { 
     print("I like toffee apples!") 
     fruit.eat() 
     // ... 
    } 

    var fruit: Apple? 
} 

class BananaSplit: Delicious { 
    func consume() { 
     print("Ah! A banana split!") 
     fruit.eat() 
     // .... 
    } 

    var fruit: Banana? 
} 

私は取得しています(関連)の誤差がある「タイプ 『ToffeeApple』プロトコルに準拠していない 『おいしいです』」(バナナとバナナスプリットでも同様です)。私はAppleBananaの両方のプロパティがEdibleに準拠しており、fruitのように要件を満たすと考えました。これらのうちの1つを間違って宣言していますか、これは不可能ですか?

多くのありがとうございます。

答えて

2

だけから変更:

protocol Delicious { 
    func consume() 

    var fruit: Edible? { get set } 
} 

protocol Delicious { 
    func consume() 

    associatedtype EdibleType: Edible 
    var fruit: EdibleType? { get set } 
} 

associatedtype EdibleType: Edible手段:プロトコルEdibleに確認unprovidedタイプEdibleTypeを有するDelicious

プロトコル。

そして、何かが確認されたら、タイプはDeliciousに提供されるべきです。あなたの場合は

class BananaSplit: Delicious { 
    func consume() { 
     print("Ah! A banana split!") 
     fruit.eat() 
     // .... 
    } 

    typealias EdibleType = Banana 
    var fruit: Banana? 
} 

EdibleTypeがタイプBananaで満たされ、

class ToffeeApple: Delicious { 
    func consume() { 
     print("I like toffee apples!") 
     fruit.eat() 
     // ... 
    } 

    typealias EdibleType = Apple 
    var fruit: Apple? 
} 

EdibleType

、タイプAppleで満たされているとIn:だからで

これについてもっと知りたいSwift Genericsを検索できます。

+0

これは動作しますが、私は理由が分かりません!この変化は実際に何を意味しますか?私は関連するタイプを読む必要があると思う。 –

+1

回答が更新されました。これがあなたが望むものです。https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html – beeth0ven

2
import UIKit 

protocol Edible { 
    func eat() 
} 

class Apple: Edible { 
    func eat() { 
     print("Crunch") 
    } 
} 

class Banana:Edible { 
    func eat() { 
     print("Homph") 
    } 
} 

protocol Delicious { 
    func consume() 

    var fruit: Edible? { get set } 
} 

class ToffeeApple: Delicious { 
    var fruit: Edible? 

    func consume() { 
     print("I like toffee apples!") 
     fruit?.eat() 
    } 

} 

class BananaSplit: Delicious { 
    var fruit: Edible? 

    func consume() { 
     print("Ah! A banana split!") 
     fruit?.eat() 
    } 
} 

let bananaSplit = BananaSplit() 
bananaSplit.consume() // Ah! A banana split! 
+0

ありがとうございました。私はこれを見ていないのに驚いています。しかし、リンゴの代わりにバナナを使ってトフィーリンゴを作ることができますが、これは私が望んだものではありませんでした。私がToffeeApplesをAppleの果物から作り出すことを強制したければ、私はEdibleの派生プロトコル(例えばAppleyと呼ばれる)を作成するだけでしょうか? –

関連する問題