gpt4 book ai didi

ios - swift 可选通用类型和嵌套可选展开

转载 作者:行者123 更新时间:2023-11-28 11:31:54 25 4
gpt4 key购买 nike

我有这段代码

class MyObject<T> {

func start(_ value: T?) {
if let value = value {
doSomething(value)
}
}

func doSomething(_ value: T) {
print(value)
}
}

MyObject<String>().start("some")
// prints "some"

MyObject<String?>().start(nil)
// doesn't print anything

我需要为传递给 start() 的每个有效值调用 doSomething()。当 T 已经是一个可选类型,比如 String?,那么 nil 就是一个有效值。

我是否需要在 MyObject 的扩展中编写两个版本的 start() 并以 T 的类型为条件?以及如何去做?

最佳答案

您可以让您的 start 函数接受一个非可选的 T 并且总是调用 doSomething 而不是先尝试打开它。如果 T 本身是可选类型,这将只允许您调用 start(nil):

class MyObject<T> {

func start(_ value: T) {
doSomething(value)
}

func doSomething(_ value: T) {
print(value)
}
}

MyObject<String>().start("some")
// prints "some"

MyObject<String?>().start(nil)
// prints "nil"

如果您想将 start 的参数保留为可选参数,那么您的原始代码实际上可以工作,但您需要更改在第二个示例中传递值的方式。

由于 TString?,您方法中的参数是 String?? 类型并传递一个 nil String? ? 不同于传递一个 String? 恰好包含 nil

如果你称它为:

MyObject<String?>().start(.some(nil))

let string: String? = nil
MyObject<String?>().start(string)

然后它会打印“nil”

关于ios - swift 可选通用类型和嵌套可选展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465667/

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