【发布时间】:2021-12-06 03:00:14
【问题描述】:
假设我已经重载了这样的 Swift 方法
func someValue<T> ( _ name: PropertyName ) -> T? {
// ...
}
func someValue ( _ name: PropertyName ) -> URL? {
// ...
}
我可以这样调用这个方法
let u = o.someValue("propA")
而u 将是URL? 类型。或者我也可以这样称呼它
let i: Int? = o.someValue("propB")
let s: String? = o.someValue("propC")
而i 将是Int? 和s 将是String?。
但是如何在不将其分配给变量的情况下使用此方法调用的结果呢?例如。我想在switch 语句中使用for 循环或者更简单:
switch o.someValue("propB") {
此调用将假定结果为URL?:
switch o.someValue("propB") as? Int {
我被告知URL? 不能转换为Int,这是正确的。但是URL? 意味着一开始就已经调用了错误的方法。
更新
这是一个最小的测试用例,因为我不能在这里发布原始代码。
【问题讨论】:
-
let i: Int = o.someValue("propB")not 在我的测试中编译。但是let i: Int? = o.someValue("propB")可以编译,switch o.someValue("propB") as Int? { ... }也是如此。如果将泛型方法的返回类型更改为T,则let i: Int = o.someValue("propB")和switch o.someValue("propB") as Int { ... }都会编译。所以我看不到问题。我是不是误会了什么? -
@MartinR 至于
IntvsInt?,你当然是正确的,我错过了问号(实际上并没有复制代码,因为我必须快速混淆真实代码)但是这应该很明显,下面的句子指出i的类型是Int?,这当然意味着类型限定符不能只是Int,对吧? -
@Mecki:好吧,如果发布的代码没有揭示声称的行为,就很难回答。以及声明 “不起作用,也不起作用?整数还是整数?工作” 仍然不正确,因为它确实使用
as Int?编译。