我有以下結構:
struct DataMatrix<T> : Sequence, IteratorProtocol {
var rows: Int, columns: Int
var headers = [String]()
var data: [T?]
var position = 0
init(columns: Int, rows: Int, header: Bool = false) {
self.rows = rows
self.columns = columns
data = Array<T?>(repeating: nil, count: rows * columns)
if header{
for i in 0..<columns{
self.headers.append("Col_\(i)")
}
}
}
我現在想多載初始化程式,以便它決議字串中的元素:
init(fromString: String, separator: String){
var finalArray = [String?]()
let lineArray = fromString.components(separatedBy: ["\n", "\r"])
self.rows = lineArray.count
var maxcolumns = 0
for currLine in lineArray{
let arrayOfCurrLine = currLine.components(separatedBy: separator)
if arrayOfCurrLine.count > maxcolumns{
maxcolumns=arrayOfCurrLine.count
}
}
self.columns = maxcolumns
for currLine in lineArray{
var elementsInserted = 0
let arrayOfCurrLine = currLine.components(separatedBy: separator)
for element in arrayOfCurrLine{
finalArray.append(element)
elementsInserted = 1
}
if elementsInserted < maxcolumns{
let difference = maxcolumns - elementsInserted
for _ in 0..<difference{
finalArray.append(nil)
}
}
}
self.data=finalArray ///fails
}
上面的代碼失敗了,因為 data[T?] 不會接受 [String?]。型別轉換也self.data=finalArray as [T?]失敗了。
最優雅的解決方案是將泛型型別 T 設定為 String?在初始化期間,但我不知道如何解決這個問題。T.self=String.Type等。不起作用,因為 T 是不可變的。
有什么建議嗎?
謝謝!
uj5u.com熱心網友回復:
你所要做的就是告訴編譯器 T 是一個字串
init(fromString: String, separator: String) where T == String {
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401134.html
上一篇:檢查GPUPowerShell
下一篇:通過反射找出類是否實作了介面
