gpt4 book ai didi

使用 `as` 关键字的 Swift 自定义类型转换

转载 作者:搜寻专家 更新时间:2023-11-01 06:32:07 24 4
gpt4 key购买 nike

例如,我有两个类,名为 ClassOneClassTwo:

open class ClassOne {
open var id: String?
public init(id: String?) {
self.id = id
}
}

open class ClassTwo {
open var id: String?
open var title: String?
public init(id: String?, title: String?) {
self.id = id
self.title = title
}
}

然后,创建一些实例:

let one = ClassOne(id: "1")

现在,如何使用one as classTwoone转换为ClassTwo类型?

我知道我可以实现像 public init(classOne: ClassOne) {} 这样的函数,但我只是想知道“如何在自定义类型上使用 as?”

我注意到一个叫做 _ObjectiveCBridgeable 的东西,纯 swift 类型有没有类似的东西?

最佳答案

你不会,或者更确切地说,Swift 不会。
(但另一方面,在 C++ 中,您只需要创建一个以其他类型为参数的构造函数,并且会自动调用该构造函数(除非标记为 explicit)。)

从编程上讲,您的类(class)没有任何关联,但是您有多种解决方案。例如:

解决方案 #1:转换

您可以向您的 ClassTwo 添加一个 init 方法,该方法将第一个类的实例作为参数。

convenience init(classOne:ClassOne) {
self.id = classOne.id
self.title = nil
}

您也可以只使用一个非初始化方法来做同样的事情。

解决方案#2:子类

使 ClassTwo 成为 ClassOne 的子类

open class ClassTwo : ClassOne {
open var title: String?
public init(id: String?, title: String?) {
super.init(id:id)
self.title = title
}
}

现在您会发现可以互换使用它(但请注意,这有时也会引起一些麻烦):

func funcThatTakesA(classOne:ClassOne) {
}

let one = ClassOne(id: "1")
let two = ClassTwo(id: "id", title: "Instance")

funcThatTakesA(classOne: one)
funcThatTakesA(classOne: two) //It works!

关于使用 `as` 关键字的 Swift 自定义类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com