提问人:Nathan Barrett 提问时间:7/26/2022 更新时间:7/26/2022 访问量:217
Swift 将一种自定义类型转换为另一种自定义类型
Swift casting one custom type to another
问:
我有一个返回“Any?”的函数,但在我的特定实例中,我知道它应该返回一个自定义的“Tuple2”对象。但是由于 Tuple2 是单独的 Swift 插件的一部分,因此我无法直接访问该结构。我在我的主要 swift 代码中有该结构的副本,我正在尝试将“Any?”结果转换为我的重复结构。但我无法说服编译器允许这样的强制转换。
关于如何解决这个问题的任何想法?
在单个文件中概述问题的示例如下。
typealias Scalar = Double
//~~~~~~ THIS HAPPENS IN THE PLUGIN ~~~~~~
struct Tuple2 {
public var x0: Scalar
public var x1: Scalar
public init(_ x0:Scalar, _ x1:Scalar) {
self.x0 = x0
self.x1 = x1
}
}
let A = Tuple2(1.0,2.0)
let B = A as! Any?
//~~~~~~ THIS HAPPENS IN MY CODE ~~~~~~
struct TupleTwo {
public var x0: Scalar
public var x1: Scalar
public init(_ x0:Scalar, _ x1:Scalar) {
self.x0 = x0
self.x1 = x1
}
}
let C = B as! TupleTwo //Error thrown here
print("x0:\(C.x0) x1:\(C.x1)")
答:
2赞
Alexander
7/26/2022
#1
但我无法说服编译器允许这样的强制转换。
好!因为事实并非如此。
Swift(大部分)使用名义类型,而不是结构类型。也就是说,只有当两种类型的(完全限定)名称相等时,它们才相等。两个名称不同的名义类型,即使内容完全相同,也永远不会等效。
本模块中的副本引入了一种新类型,该类型与您正在使用的其他模块完全无关。TupleTwo
TupleTwo
为了解决你的问题,你需要导入另一个模块,并在你的投射中使用它的类型。TupleTwo
评论