2016-10-01 3 views
6

gelöst wird Ich versuche, mein Projekt zu Swift 3, zu konvertieren, aber ich erhalte eine Fehlermeldung, dass der Ausdruck zu komplex ist, in angemessener Zeit gelöst werden. Ich bin nicht sicher, warum das so ist, da dieser Ausdruck in Swift 2.2 gut funktioniert, aber jetzt dauert es plötzlich so lange?Expression war zu komplex, um in angemessener Zeit Swift 3

Wer weiß, wie ich dieses Problem beheben? Hier ist der Ausdruck. Es ist im Grunde ein Wörterbuch, das später mit SecItemCopyMatching verwendet wird, um ein Element aus dem Schlüsselbund zu extrahieren, das mit einem Schlüssel-Tag gespeichert wurde. Es führt ein touchID, dies zu tun, da es mit dem Verriegelungs Parameter gespeichert wurde:

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

Haben Sie sich durch [diese Suchergebnisse] (http://stackoverflow.com/search?q=%5Bswift%5D+too+complex+to+be+solved+in+reasonable+time) auf die Fehlermeldung? Sie könnten etwas nützliches finden. – rmaddy

+0

die Fehler "Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden" ist stark kontextabhängig. Manchmal verursacht genau derselbe Ausdruck den Fehler in einem Kontext und nicht in einem anderen Kontext. Möglicherweise müssen Sie mehr Kontext Ihres Codes anzeigen, um Leas t zeigen, wie 'keyTag' und' message' deklariert werden. – OOPer

+0

'keyTag' und' message' sind nur Zeichenfolgen. – hockeybro

Antwort

7

Leider müssen Sie Ihre Abfrage als var zu definieren und die Werte separat zuweisen. Es scheint, dass Swift 3.0 so lange keine Ausdrücke verarbeiten kann.

Ihr Code wird wie folgt aussehen:

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

Ihre Kompilierzeit wird auf diese Weise auch kürzer sein. Hoffe, das Swift-Team verbessert dies. –

+0

Danke! Das hat funktioniert. – hockeybro

2

versuchen, alle Wörterbuch Werte AnyObject Gießen. Es sei denn sie bereits von NSObject (wie NSString abgeleitete Objekte sind, NSNumber, NSArray und NSDictionary), müssen Sie sie AnyObject werfen. Swift 3 die automatische Überbrückung zu Foundation Typen entfernt hat.

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

Dies scheint auch zu funktionieren. Habe noch nicht getestet, aber es beseitigt den Fehler. Vielen Dank – hockeybro

Verwandte Themen