4

以下にいくつかのコードがあり、コンパイル時にエラーが発生するものとそうでないものがあります。バグはありますか、それともここでジェネリックについて何か見逃していますか?

1)動作しません:

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]
    }
}

しかし、これは機能します:

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: DataTypeまた、との違いは何ですかT:DataType

PS:DataType は空のプロトコルです

4

1 に答える 1

2

おそらく問題は、配列がオブジェクトを期待しているのに、プロトコルが参照 DataType から継承していないことです。

たとえば、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
    }
}
于 2016-04-19T13:35:43.833 に答える