根据aws.amazon.com/mobile/的当前示例代码,有许多代码项目他们没有很好地更新到Swift 3(考虑到他们的资源,这非常奇怪)。
当你来到AWSMobileClient.swift时,有一行代码如下:
if (!isInitialized) {
AWSIdentityManager.defaultIdentityManager().resumeSession(completionHandler:
{(result: AnyObject?, error: NSError?) -> Void in
print("Result: \(result) \n Error:\(error)")
} as! (Any?, Error?) -> Void)
isInitialized = true
}
在任何跑步中都会崩溃。
幸运的是,我能够通过更改像这样的参数来修复它
AWSIdentityManager.defaultIdentityManager().resumeSession(completionHandler:
{(result: Any?, error: Error?) -> Void in
print("Result: \(result) \n Error:\(error)")
} as! (Any?, Error?) -> Void)
问题是这样,我收到了警告
事实上,尝试将其转换为相同类型似乎毫无意义。但如果你只是删除演员
AWSIdentityManager.defaultIdentityManager().resumeSession(completionHandler:
{(result: AnyObject?, error: NSError?) -> Void in
print("Result: \(result) \n Error:\(error)")
}
isInitialized = true
根本不起作用,你会得到各种奇怪的语法错误
1)为什么还有演员呢?
2)我怎样才能摆脱演员阵容,或者正确地写出来,因此没有相同的演员,因此没有警告?
3)我猜一个解决方案就是去除力(所以,as
而不是as!
),但我真的不明白为什么你必须在那里施放。< / p>
注意 - 在相同的代码行中,亚马逊包含注释&#34;如果您在iOS模拟器中获得了EXC_BAD_ACCESS,那么请执行模拟器 - &gt;重置内容和设置...,这将清除由具有相同捆绑ID的其他应用程序存储的错误身份验证令牌。&#34; 我在这里询问的问题与此完全无关。
答案 0 :(得分:4)
在最后一个可能是正确语法的例子中,缺少右括号。
您已取代
} as (Any?, Error?) -> Void)
带
}
而不是预期})
我删除了一些非必要的内容,以便更清楚:
WSIdentityManager.defaultIdentityManager().resumeSession(completionHandler: { (result, error) in
print("Result: \(result) \n Error:\(error)")
})
isInitialized = true
使用尾随闭包语法或更短:
WSIdentityManager.defaultIdentityManager().resumeSession() { (result, error) in
print("Result: \(result) \n Error:\(error)")
}
isInitialized = true
不需要类型注释(在完成块中)。他们可能弊大于利。
PS:<{1}}是否应该>>
完成块?