我正在嘗試為各種資料型別撰寫二維資料存盤結構。但是,由于“無法將“T”型別的值分配給“T”型別的下標錯誤,我正在努力使用用于設定資料的下標。任何幫助深表感謝!
struct dataMatrix<T> : Sequence, IteratorProtocol {
var rows: Int, columns: Int
var data: [T]
var position = 0
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
data = Array<T>()
}
func valueAt(column: Int, row: Int) -> T? {
guard column >= 0 && row >= 0 && column < columns else {
return nil
}
let indexcolumn = column row * columns
guard indexcolumn < data.count else {
return nil
}
return data[indexcolumn]
}
}
subscript<T>(column: Int, row:Int) -> T?{
get{
return valueAt(column: column, row: row) as? T
}
set{
data[(column * row) column] = (newValue as! T) // does not compile
}
}
// sequence iterator protorocl methods
mutating func next() -> String? {
if position <= data.count{
print(position)
defer { position = 1 }
return "\(position)"
}else{
defer {position = 0}
return nil
}
}
}
uj5u.com熱心網友回復:
subscript<T>(column: Int, row:Int) -> T?{
定義了一種型別的占位符的通用方法T是無關的通用型別T的struct dataMatrix<T>。解決方案很簡單:洗掉型別占位符:
subscript(column: Int, row: Int) -> T? {
// ...
}
這也使得 getter 和 setter 中的型別轉換變得不必要。您只需要決定在使用nil引數呼叫 setter 時該怎么做(例如:沒有):
subscript(column: Int, row: Int) -> T? {
get {
return valueAt(column: column, row: row)
}
set {
if let value = newValue {
data[(column * row) column] = value
}
}
}
另一種選擇是使下標方法的回傳型別非可選,并將無效索引視為致命錯誤(這是 SwiftArray處理它的方式):
subscript(column: Int, row: Int) -> T {
get {
guard let value = valueAt(column: column, row: row) else {
fatalError("index out of bounds")
}
return value
}
set {
data[(column * row) column] = newValue
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/399869.html
