在初始化期间设置通用结构的类型 (Swift)

Setting type of generic struct during initialization (Swift)

我有以下结构:

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 是不可变的。

有什么建议吗?

谢谢!

你所要做的就是告诉编译器 T 是一个字符串

init(fromString: String, separator: String) where T == String {
    // ...     
}