gpt4 book ai didi

swift - 在 Swift 中转换为泛型可选

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:18 24 4
gpt4 key购买 nike

我在 Swift 中摆弄泛型并遇到了一些我无法弄清楚的事情:如果我将一个值转换为泛型参数的类型,则不会执行转换。如果我对静态类型进行相同的尝试,它会起作用。

class SomeClass<T> {
init?() {
if let _ = 4 as? T {
println("should work")
} else {
return nil
}
}
}

if let _ = SomeClass<Int?>() {
println("not called")
}

if let _ = 4 as? Int? {
println("works")
}

有人可以解释这种行为吗?两种情况不应该是等价的吗?

更新

上面的例子被简化到最大程度。下面的例子说明了更好的转换的必要性

class SomeClass<T> {
init?(v: [String: AnyObject]) {
if let _ = v["k"] as? T? {
print("should work")
} else {
print("does not")
return nil
}
}
}

if let _ = SomeClass<Int?>(v: ["k": 4]) {
print("not called")
}

if let _ = SomeClass<Int>(v: ["k": 4]) {
print("called")
}

第二次更新

@matt 让我了解了 AnyObjectAny 并且@Darko 在他的评论中指出字典如何使我的示例过于复杂之后,这是我的下一个改进

class SomeClass<T> {
private var value: T!

init?<U>(param: U) {
if let casted = param as? T {
value = casted
} else {
return nil
}
}
}


if let _ = SomeClass<Int?>(param: Int(4)) {
println("not called")
}

if let _ = SomeClass<Int>(param: Int(4)) {
println("called")
}

if let _ = Int(4) as? Int? {
println("works")
}

if let _ = (Int(4) as Any) as? Int? {
println("Cannot downcast from Any to a more optional type 'Int?'")
}

我之前尝试使用 init?(param: Any),但这会产生与最后一个 if 中说明的相同问题,即 discussed elsewhere .

所以归结为:有没有人真的将任何东西转换为通用可选类型?任何状况之下?我很乐意接受任何工作示例。

最佳答案

这真的与泛型无关;它是关于 AnyObject(以及转换的工作原理)的。考虑:

    let d = ["k":1]
let ok = d["k"] is Int?
print (ok) // true

// but:

let d2 = d as [String:AnyObject]
let ok2 = d2["k"] is Int?
print (ok2) // false, though "is Int" succeeds

由于您的初始化程序将字典转换为 [String:AnyObject],您处于同一条船上。

关于swift - 在 Swift 中转换为泛型可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080420/

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