在初始化期间设置通用结构的类型 (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 {
// ...
}
我有以下结构:
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 {
// ...
}