2016-10-01 83 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

相關問題