我遇到了在 Swift 中使用泛型的问题 - 我有 Java 泛型方面的经验,并且正在努力翻译我的知识。我有一个采用通用参数类型的方法,在协议(protocol)中定义如下:
protocol Board {
func getPlace<T : Position>(position: T) -> Place
}
想法是 Board
可以有自己的 Position
类型,就像 SquareBoard
的 XYPosition
>,但六边形棋盘的位置类型不同。
但是,下面的 playground 片段有一个非常奇怪的错误:
/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
它是用不同的标识第二次重新定义类型吗?我似乎无法确定我做错了什么。该问题可在以下 Playground 上重现:
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
}
}
最佳答案
由于您没有发布您的实际代码,因此有点令人困惑。不知道 getPlace 与您的问题有什么关系,我不确定您到底想要完成什么
无论哪种方式,我都有你的 Playground ,希望你可以从那里开始工作:
protocol Position : Equatable {
var x: Int { get }
var y: Int { get }
}
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<T: Position>(position: T) -> Int {
return (position.y * 10) + position.x
}
func getPlace<T: Position>(position: T) -> Int {
let index = toIndex(position: position)
return index
}
}
首先,在你原来的getPlace<XYPosition>
, XYPosition 是本地定义的类型,与您的结构无关,因此当您调用 as! XYPosition
时您正在尝试将其转换为本地类型,而不是您的结构。
其次,我猜您误解了如何使用结构。结构不能被子类化,因此您不能将结构用作泛型。只有一个协议(protocol)或类。如果您要传递结构,则可以只传递结构本身。
关于swift - 使用泛型时无法将类型 'A' 的值转换为预期的参数类型 'A',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166207/