2016-10-01 90 views
6

我想将我的项目转换为Swift 3,但我收到一条错误消息,表达式太复杂,无法在合理的时间内解决。我不确定这是为什么,因为这个表达式在Swift 2.2中工作正常,但是现在突然间它花了这么长时间?表达式太复杂,无法在合理的时间内解决Swift 3

有谁知道我该如何解决这个问题?这是表达。它基本上是一个字典,稍后将与SecItemCopyMatching一起用于从钥匙串中提取保存有钥匙标签的物品。它执行touchID要做到这一点,因为它保存与锁定参数:

let query : [String: AnyObject] = [String(kSecClass) : kSecClassGenericPassword, 
    String(kSecAttrService) : keyTag as AnyObject, 
    String(kSecAttrAccount) : keyTag, 
    String(kSecReturnData) : kCFBooleanTrue, 
    String(kSecMatchLimit) : kSecMatchLimitOne, 
    String(kSecUseOperationPrompt) : message] 
+1

你有没有通过[这些看起来搜索结果](http://stackoverflow.com/search?q=%5Bswift%5D+too+complex+to+be+solved+in+reasonable+time)上的错误信息?你可能会发现一些有用的东西 – rmaddy

+0

The错误“表达式太复杂,无法在合理的时间内解决”与上下文高度相关,有时完全相同的表达式会导致上下文中出现错误,而不会出现在其他上下文中。监听中心显示'keyTag'和'message'是如何声明的。 – OOPer

+0

'keyTag'和'message'只是字符串。 – hockeybro

回答

7

不幸的是,你必须有定义查询为var,并分别分配值。看来Swift 3.0不能处理这么长时间的表达式。

您的代码将是这样的:

var query = [String: AnyObject]() 
query[String(kSecClass)] = kSecClassGenericPassword 
query[String(kSecAttrService)] = keyTag as AnyObject 
query[String(kSecAttrAccount)] = keyTag 
query[String(kSecReturnData)] = kCFBooleanTrue 
query[String(kSecMatchLimit)] = kSecMatchLimitOne 
query[String(kSecUseOperationPrompt)] = message 
+0

您的编译时间也会缩短。希望Swift团队改进这一点。 –

+0

谢谢!这工作。 – hockeybro

2

尝试铸造所有字典值AnyObject。除非他们已经被物体挡住NSObject(如NSStringNSNumberNSArray和​​派生,你需要将它们转换为AnyObject。斯威夫特3去掉了自动桥接至基金会类型。

let query: [String: AnyObject] = [String(kSecClass) : kSecClassGenericPassword as AnyObject, 
            String(kSecAttrService) : keyTag as AnyObject, 
            String(kSecAttrAccount) : keyTag as AnyObject, 
            String(kSecReturnData) : kCFBooleanTrue as AnyObject, 
            String(kSecMatchLimit) : kSecMatchLimitOne as AnyObject, 
            String(kSecUseOperationPrompt) : message as AnyObject] 
+0

这也似乎工作。还没有测试过,但它摆脱了错误。谢谢 – hockeybro

相关问题