2016-10-01 16 views
6

Tôi đang cố gắng chuyển đổi dự án của mình sang Swift 3, nhưng tôi nhận được thông báo lỗi rằng biểu thức quá phức tạp để được giải quyết trong thời gian hợp lý. Tôi không chắc tại sao điều này lại xảy ra, vì biểu thức này hoạt động tốt trong Swift 2.2, nhưng bây giờ tất cả đột ngột mất quá nhiều thời gian?Biểu hiện quá phức tạp để được giải quyết trong thời gian hợp lý Swift 3

Có ai biết cách khắc phục sự cố này không? Đây là biểu thức. Về cơ bản nó là một từ điển sẽ được sử dụng sau này với SecItemCopyMatching để trích xuất một mục từ keychain đã được lưu với một thẻ khóa. Nó thực hiện một touchID để làm điều này, vì nó đã được cứu với tham số khóa:

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

bạn đã xem qua [những kết quả tìm kiếm] (http://stackoverflow.com/search?q=%5Bswift%5D+too+complex+to+be+solved+in+reasonable+time) trên thông báo lỗi? Bạn có thể tìm thấy một cái gì đó hữu ích – rmaddy

+0

"Biểu thức quá phức tạp để được giải quyết trong thời gian hợp lý" phụ thuộc nhiều vào ngữ cảnh. Đôi khi chính xác cùng một biểu thức gây ra lỗi trong ngữ cảnh và không trong ngữ cảnh khác. Bạn có thể cần hiển thị thêm ngữ cảnh của mã, tại leas t hiển thị như thế nào 'keyTag' và' message' được khai báo. – OOPer

+0

'keyTag' và' message' chỉ là chuỗi. – hockeybro

Trả lời

7

Thật không may, bạn phải có để xác định truy vấn của bạn như var và gán các giá trị riêng biệt. Có vẻ như Swift 3.0 không thể xử lý các biểu thức này lâu.

Mã của bạn sẽ trông như thế này:

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

Thời gian biên dịch của bạn cũng sẽ ngắn hơn theo cách này. Hy vọng nhóm Swift sẽ cải thiện điều này. –

+0

Cảm ơn! Điều này làm việc. – hockeybro

2

Hãy thử casting tất cả các giá trị từ điển để AnyObject. Trừ khi họ đã được các đối tượng có nguồn gốc từ NSObject (như NSString, NSNumber, NSArrayNSDictionary), bạn cần phải cast họ AnyObject. Swift 3 đã loại bỏ cầu nối tự động với các loại Foundation.

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

Điều này cũng có vẻ hoạt động. Chưa thử nghiệm, nhưng nó sẽ loại bỏ lỗi. Cảm ơn – hockeybro

Các vấn đề liên quan