swift - 使用泛型时无法将类型 'A' 的值转换为预期的参数类型 'A'

标签 swift generics

我遇到了在 Swift 中使用泛型的问题 - 我有 Java 泛型方面的经验,并且正在努力翻译我的知识。我有一个采用通用参数类型的方法,在协议(protocol)中定义如下:

protocol Board {
    func getPlace<T : Position>(position: T) -> Place
}

想法是 Board 可以有自己的 Position 类型,就像 SquareBoardXYPosition >,但六边形棋盘的位置类型不同。

但是,下面的 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/

相关文章:

swift - 从另一个类重置扩展文件 userdefault

c# - 如何创建扩展方法来处理带有谓词输入的 bindinglist.removeall

ios - 无法将具有通用类型的类添加到 swift Realm

python - Swift/Python 引用计数差异

swift - Firebase 按顺序获取数据

dictionary - 在 Swift 中从字典中读取时向下转换元素

c# - 如何在注入(inject)的类上调用泛型方法而不通知泛型类型的父类?

java - 这些类声明与 Comparable 有什么区别?

Java Generics调用self类解释

ios - 如何检测UIBarButtonitem中的长按