2016-03-31 14 views
8

Feedには、Feedableプロトコルで定義されている必要なプロパティを実装している限り、特定の項目が表示されるとします。さんもPhotoオブジェクトがフィードに値するされていることを言ってみましょう:スイフトアレイをプロトコルに準拠させる

extension Photo: Feedable { } 

それはこれらの写真のArrayFeedableにあるかもしれないと言うことは可能ですか?

extension [Photo] : Feedable 

または私はいつもFeedableに準拠するために、PhotoAlbumとして、ラッパーオブジェクトのいくつかの種類が必要なのですか?

編集

再反復するために、私は私がPhotoオブジェクトFeedableの配列のみを行うことができるかどうか興味がありました。 をコンテンツタイプFeedableにしないで、Feedable自体の配列をFeedableにしないでください(どちらも必要な場合は以下の解決策として提供されます)。 (私が存在する疑い)ソリューションは、私は次のような結果とタイプFeedableの変数を定義することができるようになるつまり

、:

var feedable: Feedable 

//photo is feedable, so this is fine 
feedable = Photo() //ok 

//arrays of photos are feedable 
let photo1 = Photo() 
let photo2 = Photo() 
feedable = [photo1, photo2] 

//arrays of other things are not 
feedable = ["no", "dice"] //nope 

//even if the contents of an array are themselves Feedable, that's not sufficient. E.g. Video is Feedable, but Array of Videos is not. 
let video1 = Video() 
let video2 = Video() 
feeble = video1 //fine 
feedable = [video1, video2] //nope 

おそらく(もちろんコンパイルされません)this gistショー意図はより明確になる。

+2

'extension Array要素:Feedable {...}' –

+0

@LeoDabus 'Photo'オブジェクトの配列と他の' Feedable'型の配列の 'Feedable'プロトコルの特定の実装を提供するつもりです。例えば、Photosの配列は 'Video'オブジェクトの配列とは異なる' feedDescription'を提供するかもしれません。 –

+0

@matt 'Feedable'プロトコルは、'写真 'と'写真 'のグループとで異なる' feedDescription'実装を提供します。例えば。 "写真が追加されました"と "5枚の写真が追加されました"。フィードにふさわしいアイテム(写真、ビデオ、またはそのいずれかのグループ)のみが提供されているとします。 –

答えて

-4

私が遊び場にしようとしなかったが、多分あなたは単に搬送可能なの配列を行うことができます。

var myPhotosArray = [Feedable]() 

そして、給電可能プロトコルを実装し、すべてが配列に許されます。写真配列だけが必要な場合でも、Photoableオブジェクトをサブクラス化して、FeedablePhotoオブジェクトを作成できます。

テストをしなくても、下書きするのではなく、プレイグランドでこれを試してください。 PhotoVideoの配列があった場合はいかなる理由や説明なし 真剣に3 downvotes ...

import UIKit 

protocol Tree: class { 
    func grow() 
} 

class BigTree: Tree { 
    internal func grow() { 
    print("Big tree growing") 
    } 
} 

class SmallTree: Tree { 
    internal func grow() { 
    print("Small tree growing") 
    } 
} 

class Car { 
    //not a tree 
} 

var manyTrees = [Tree]() 

manyTrees.append(BigTree()) 
manyTrees.append(SmallTree()) 
manyTrees.append(Car()) //This makes an error "Car doesn't conform to expected type 'Tree'" 
+0

この投稿で-1を実行する前に試しましたか?私は試して、それは働いた。 – Mikael

+0

私は自分で-1しなかったが、これは全く質問に答えない。私はそれがダウン投票されている理由だと思う。 –

+0

私の理解から、そうです。 Feedableプロトコルを実装しているクラスのみを配列に追加できます。質問:「これらの写真のアレイがフィード可能であると言うことは可能でしょうか?」私の答えは分かりにくいと思います。私はSwift 3ではこれを試しませんでしたが、Swift 2で試してみました。単にPhotoクラスでプロトコルを実装してください。 – Mikael

3

、何がなりたいですか?

1.すべての要素は、同じように機能します。

extension Array where Element : Feedable { 
    func foo() { 
     if Element.self == Photo.self { 

     } else { 

     } 
    } 
} 

2.配列全体が「ビデオ」として実行されます。

extension Array where Element : Photo { 
    func foo() { 

    } 
} 
+0

私は前者を望みますが、どのタイプの配列もすべて「Feedable」にする必要はありません。 –

+0

@BenPackard Elementは配列の総称型です。条件付きの拡張子は、配列がすべての条件を確認したときにのみ機能します。 – Lumialxk

+0

@ ben-packard提案されたソリューションのwhere句は、この拡張が配列の要素型がFeedableプロトコルに適合する配列にのみ適用されることを意味します。「すべての配列の配列すべて」ではありません。 –

0

これは現在できません。私のプロジェクトでは、ModelProducerと同じ問題があります。

protocol M: ModelType {} 
protocol ModelProducerType { 
    associatedtype M: ModelType 
    var model: M? { get } 
    func produce() 
} 

struct Test: ModelType {} 
class TestProducer: ModelProducerType { 
    var model: Test? 
    func produce() { 
     model = Test() 
    } 
} 

私はゴーストプロトコルとしてModelTypeを使用します。問題は、あなたが発見したのと同じ理由で複数のModelTypeを生産するモデルプロデューサーを作ることができないということです。この場合の解決策は次のとおりです。

protocol M: ModelType {} 
protocol ModelProducerType { 
    associatedtype M: ModelType 
    var model: [M] { get } 
    func produce() 
} 

struct Test: ModelType {} 
class TestProducer: ModelProducerType { 
    var model: [Test] = [] 
    func produce() { 
     model = [Test()] 
    } 
} 

これは最初から柔軟性があります。私は省略可能な変数を取り除き、単一モデルのプロデューサは配列内に1つの項目しか持たない。おそらく同様のアプローチを使用することができます。

関連する問題