我在Swift中遇到了使用泛型的問題 - 我在Java中使用泛型的經驗,並且正在努力翻譯我的知識。我有采用一個通用的參數類型,在協議中定義像這樣的方法:在使用泛型時,無法將類型'A'的值轉換爲期望的參數類型'A'
protocol Board {
func getPlace<T : Position>(position: T) -> Place
}
的想法是,在Board
可具有其自己類型的Position
,像一個XYPosition
用於SquareBoard
,但不同類型的六角板的位置。
但是,下面的操場片斷有一個很奇怪的錯誤:
/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:39: error: cannot convert value of type 'XYPosition' to
expected argument type 'XYPosition'
let index = toIndex(position: position)
^~~~~~~~
as! XYPosition
如果我試圖迫使投position
,它會變得怪異:
/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:48: warning: forced cast of 'XYPosition' to same type h
as no effect
let index = toIndex(position: position as! XYPosition)
^~~~~~~~~~~~~~
/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:48: error: cannot convert value of type 'XYPosition' to
expected argument type 'XYPosition'
let index = toIndex(position: position as! XYPosition)
~~~~~~~~~^~~~~~~~~~~~~~
as! XYPosition
是它重新定義的類型第二次以不同的身份?我似乎無法確定我做錯了什麼。這個問題可以在下面的遊樂場中重現:
import Cocoa
protocol Position : Equatable {
}
struct XYPosition : Position {
let x : Int
let y : Int
}
func ==(lhs: XYPosition, rhs:XYPosition) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
public class Test {
private func toIndex(position: XYPosition) -> Int {
return (position.y * 10) + position.x
}
func getPlace<XYPosition>(position: XYPosition) -> Int {
let index = toIndex(position: position as! XYPosition)
return 4
}
}