2017-06-20 49 views
0

我可以在Swift中定義一個方便的下標setter嗎?Swift方便下標

例如,讓我們說我:

extension Matrix { 
    subscript(_ i: Int, _ j: Int) -> Double { 
    get { 
     return value(atRow: i, column: j) 
    } 
    set { 
     setValue(newValue, row: i, column: j) 
    } 
    } 
} 

,我也希望定義一個接受浮動,因爲我已經厭倦了人工鑄造的制定者。我想這樣做:

extension Matrix { 
    subscript(_ i: Int, _ j: Int) -> Double { 
    get { 
     return value(atRow: i, column: j) 
    } 
    set { 
     setValue(newValue, row: i, column: j) 
    } 
    } 

    subscript(_ i: Int, _ j: Int) -> Float { 
    set { 
     setValue(Double(newValue), row: i, column: j) 
    } 
    } 
} 

但我不能這樣做,因爲第二個下標沒有getter。

回答

1

由於斯威夫特允許在返回值來重載(不像Java和C++),你可以添加一個Float吸氣:

extension Matrix { 
    subscript(_ i: Int, _ j: Int) -> Double { 
     get { return value(atRow: i, column: j) } 
     set { setValue(newValue, row: i, column: j) } 
    } 

    subscript(_ i: Int, _ j: Int) -> Float { 
     get { return Float(value(atRow: i, column: j)) } 
     set { setValue(Double(newValue), row: i, column: j) } 
    } 
} 

但是,當您嘗試使用下標操作符的,你會遇到麻煩上下文允許FloatDouble。例如:

20. let m = Matrix() 
21. let x = m[0, 0] 

error: repl.swift:21:10: error: ambiguous use of 'subscript' 
let x = m[0, 0] 
     ^

repl.swift:9:5: note: found this candidate 
    subscript(_ i: Int, _ j: Int) -> Double { 
    ^

repl.swift:14:5: note: found this candidate 
    subscript(_ i: Int, _ j: Int) -> Float { 
    ^

您可以通過指定類型歧義:

let x: Float = m[0, 0] 
+0

這就是我擔心的一樣,太糟糕了SWIFT不支持二傳手而已,它沒有任何意義 – Guig