Swift 新手,手动将 swift 2 转换为 swift 5 时遇到问题

New To Swift, Having Trouble Converting swift 2 to swift 5 manually

提问人:rwb977 提问时间:4/15/2021 最后编辑:vadianrwb977 更新时间:4/15/2021 访问量:55

问:

我年轻的时候曾经搞砸过一点,我构建了一个应用程序,我目前正在尝试修复然后改进,但我在将 swift 2 转换为 swift 5 时遇到了一些问题,并且该应用程序无法编译

问题 1: 无法将类型为“(NSError) -> ()”的值转换为预期的参数类型“((Error) -> Void)?

参考以下两行代码:

}) { (error:NSError) in
        print(error.localizedDescription)

问题 2: Any 类型的值没有下标

参考这些行:

key = snapshot.key
itemRef = snapshot.ref

if let shareContent = snapshot.value!["content"] as? [[String:Any]] {
    content = shareContent
    
}
else{
    content = ""
}
if let shareUser = snapshot.value!["addedByUser"] as? [[String:Any]] {
    addedByUser = shareUser
}else{
    content = ""

问题 3: 表达式类型不明确,没有更多上下文

FIRAuth.auth()?.signInWithEmail("", password: "", completion: { (user:FIRUser?, error:NSError?) in
            if error == nil {
                print(user?.email)

如果有人能帮忙解决这些问题,我将不胜感激

iOS版 swift swift2 swift5

评论


答:

1赞 vadian 4/15/2021 #1

问题 1) 和 3):不要注释类型,在 Swift 3+ 中,错误已成为符合Error

}) { error in
    print(error.localizedDescription)

关于 3) 在 Firebase 文档中寻找正确的类型,它不再是了。(FIRUser?, NSError?)

问题 2):在 Swift 3+ 中,编译器必须知道任何下标对象的静态类型。如果它应该是一本字典,你必须有条件地将其降级value

if let sharedValue = snapshot.value as? [String:Any],
    let shareContent = sharedValue["content"] as? [[String:Any]] {
    content = shareContent
    
}
-1赞 Clean Coder 12/19/2023 #2

当然!以下是针对您的问题的简明和更新示例:

问题 1:

}) { error in
    if let error = error as NSError? {
        print(error.localizedDescription)
    }
}

问题 2:

key = snapshot.key
itemRef = snapshot.ref

if let shareContent = snapshot.value?["content"] as? [[String: Any]] {
    content = shareContent
} else {
    content = ""
}

if let shareUser = snapshot.value?["addedByUser"] as? [[String: Any]] {
    addedByUser = shareUser
} else {
    addedByUser = ""
}

问题 3:

FIRAuth.auth()?.signIn(withEmail: "", password: "") { user, error in
    if error == nil {
        print(user?.email)
    }
}

如果您使用的是较新版本的 Firebase SDK,请记得替换为。FIRUserUser