2016-04-19 10 views
4

以下にいくつかのコードがありますが、いくつかはコンパイル時にエラーを出します。バグはありますか、ここでジェネリックについて何か迷っていますか?汎用配列にプロトコル配列を割り当てることができません

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T where T: DataType>(dataObjects: [T]) { 
     self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType] 
    } 
} 

をしかし、これは動作します:

1)は動作しません

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T where T: DataType>(dataObjects: [T]) { 
     self.dataObjects = [] 
     for dataObject in dataObjects { 
      self.dataObjects.append(dataObject) 
     } 
    } 

} 

2)は動作しません:

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T:DataType>(dataObjects: [T]) { 
     self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType] 
    } 
} 

しかし、この作品を:

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T:DataType>(dataObjects: [T]) { 
     self.dataObjects = [] 
     for dataObject in dataObjects { 
      self.dataObjects.append(dataObject) 
     } 
    } 
} 

3) これも動作します:

また
class DataSource<T: DataType>: NSObject { 
    var dataObjects: [T] 

    init(dataObjects: [T]) { 
     self.dataObjects = dataObjects 
    } 
} 

T where T: DataTypeT:DataType

PSとの違いは何ですか:データ型は

+0

'のinit(データオブジェクト:[データ型])と間違っている何'?それでも、データ型の権利に準拠した配列を受け入れますか? –

+0

しかし、なぜこれらの仕事はしないのですか? – osrl

+0

あなたは正しいです、迅速なバグかもしれません –

答えて

2

ほとんどの空のプロトコルであり、問題は、配列がオブジェクトを予期している間に、プロトコルが参照データ型から継承していないことです。

例えば、Anyを参照一方

protocol DataType: Any { 
} 

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T:DataType>(dataObjects: [T]) { 
     self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType] 
    } 
} 

によって常にではない、ANYOBJECTは常にある:

protocol DataType: AnyObject { 
} 

class DataSource: NSObject { 
    var dataObjects: [DataType] 

    init<T:DataType>(dataObjects: [T]) { 
     self.dataObjects = dataObjects //Works fine 
    } 
} 
+1

はい、プロトコルを宣言するなら'protocol DataType:class {}'のようなクラスプロトコルとして、コードがコンパイルされます。 –

+0

それでは、「追加」と3番目の方法はどのように機能しますか? – osrl

+1

@osrl私はそれが迅速なバグではないと言っているわけではありません。配列は 'Any'値を含むことができます。しかし、ジェネリック医薬品は現時点では非常にバギーであり、最近私はそれらに多くの問題がありました。私はなぜ2番目と3番目の仕事、イーホーはすべて動作する必要がありますか分からない。 – Daniel

関連する問題