Swift 新手,无法手动将 swift 2 转换为 swift 5

Posted

技术标签:

【中文标题】Swift 新手,无法手动将 swift 2 转换为 swift 5【英文标题】:New To Swift, Having Trouble Converting swift 2 to swift 5 manually 【发布时间】:2021-07-10 14:28:40 【问题描述】:

我小时候经常搞乱,我构建了一个我目前正在尝试修复然后改进的应用程序,但是我在将 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)

如果有人可以帮助解决这些问题,我将非常感激

【问题讨论】:

【参考方案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
    

【讨论】:

以上是关于Swift 新手,无法手动将 swift 2 转换为 swift 5的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.0 - stringByAppendingPathComponent 错误转换 [重复]

导致“无法将不可变作为 inout 传递”的 Swift 3 转换 [重复]

Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型

Swift,无法转换类型的值

Swift 解析 JSON 时出现问题:无法将“__NSCFDictionary”类型的值转换为“NSArray”错误

Swift 2 到 Swift 3:无法将类型 '(Data?, NSError?) -> Void' 的值转换为预期的参数类型 'GTMSessionFetcherCompletionHand