2017-05-23 11 views
0

私スウィフトコードをビルドするとき、私はこのエラーを取得して「挿入」を起動することはできません:型の引数リストBaseCellData

Cannot invoke 'insert' with an argument list of type '(BaseCellData, at: Int)' on the row 

私は、次のコードを実行すると:私はT以来考え出し

public class CellDataCollection<T: BaseCellData> { 
    private var data = [T]() 

    func populate(from data: [T]) { 
     self.data = data 
     let firstObjectIsHeader = data.first?.isHeader ?? false 
     if !firstObjectIsHeader { 
      let newEmptyHeader = BaseCellData(isEmptyHeader: true) 
      self.data.insert(newEmptyHeader, at: 0) 
     } 
     // ... 
    } 
} 

をBaseCellDataです。BaseCellDataの新しいインスタンスをTの配列に追加するのは問題ありません。何が問題なのですか?

答えて

0

私は、BaseCellTypeを実装するすべてのサブクラスにコンストラクタを追加して解決しました。私の基本クラスが今持っている

public class CellDataCollection<T: BaseCellData> { 
func dataWithLeadingEmptyHeader(from data: [T]) -> [T] { 
     var newData = data 
     let firstObjectIsHeader = data.first?.isHeader ?? false 
     if !firstObjectIsHeader { 
      let newEmptyHeader = T(isEmptyHeader: true) 
      newData.insert(newEmptyHeader, at: 0) 
     } 
     return newData 
    }  

    func populate(from data: [T]) { 
     self.data = dataWithLeadingEmptyHeader(from: data) 
     // ... 
    } 
} 

、2つの新しいINITS:

public class SelectIconCellData: BaseCellData { 
    var iconName: String = "" 

    init(text: String, imageName: String) { 
     super.init() 
     // ... 
    } 

    required public init(isEmptyHeader: Bool) { 
     super.init(isEmptyHeader: isEmptyHeader) 
    } 
} 

public class BaseCellData: XXX { 
    required override public init(isEmptyHeader: Bool) { 
     super.init() 
     isHeader = true 
     self.isEmptyHeader = isEmptyHeader 
    } 

    public override init() { 
     super.init() 
    } 
} 

とサブのクラス今つの新しいのinitを持っているこれは、私が代わりにBaseCellTypeのTのインスタンスを作成することができ

0

強制キャストnewEmptyHeaderとしてTが私のマシンで遵守しました。

+0

これ以外の場合、Tが 'BaseCellData'以外の場合は実行時例外が発生します。したがって、一般的な役に立たないようにする。 –

+0

はい、同意します。ジェネリックの特定の型を使用するとジェネリック全体が失敗します。 – BangOperator

+0

残念ながら、実行時にクラッシュする – Sunkas

0

Tの配列は、BaseCellDataがより一般的な特定の型です。

class Animal {} 
class Dog: Animal {} 
class Cat: Animal {} 

そして、あなたは明らかにあなたが猫や

var dogs = [Dog] 
dogs.append(Cat()) // Not allowed 
dogs.append(Animal()) // Also not allowed  

だから、あなたは持っている場合は、それまで動物を追加することができませんでした、犬の配列を作成します。たとえば

は、あなたがこれらのクラスを持っていたと言います汎用:

class AnimalCollection<T:Animal> { 
    var animals: [T] 
} 

次に、コレクションを作成すると、あなたが遺伝子として定義するものリックタイプ。したがって:

配列の型はDogであり、動物や猫を追加する前に見たとおり、許可されません。

+0

を言いました。はい、私は自分のコードで間違っていると思っています。特定のTタイプのリストにベースクラスを挿入しようとしています。私は私の解決策を考え直しました。 – Sunkas