2016-10-05 14 views
5

Tôi có mã để thực hiện một số NSFetchRequest và đưa kết quả của nó vào một mảng kiểu mô hình dữ liệu tùy chỉnh của tôi. Tìm nạp có thể ném nhưng tôi không muốn quan tâm đến lỗi vì vậy tôi sử dụng try? và tôi cũng sử dụng as? khi truyền. Trong Swift 2, đây từng là tốt, nhưng Swift 3 tạo ra một đôi tùy chọn:Tùy chọn ràng buộc với thử? và như thế nào? vẫn tạo ra một kiểu tùy chọn

var expenses: [Expense]? { 
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: Expense.entityName) 
    request.predicate = NSPredicate(format: "dateSpent >= %@ AND dateSpent <= %@", [self.startDate, self.endDate]) 

    // Returns [Expense]? because right side is [Expense]?? 
    if let expenses = try? App.mainQueueContext.fetch(request) as? [Expense], 
     expenses?.isEmpty == false { 
     return expenses 
    } 
    return nil 
} 

Làm thế nào tôi có thể nói lại phía bên phải của ràng buộc tùy chọn của tôi trong if let để loại của nó sẽ chỉ đơn giản là một mảng [Expense]? Tôi nghĩ rằng nó có vẻ vô lý rằng trong điều kiện boolean sau (được sử dụng để được một khoản where), mảng vẫn là tùy chọn.

Trả lời

7

Bạn phải quấn gọi try? của bạn trong vòng ngoặc như thế này:

if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense] 

Đó là bởi vì as? có độ ưu tiên cao hơn try? (có lẽ vì try? có thể được áp dụng cho toàn bộ biểu thức).

+1

Xác nhận rằng công trình này. Thật là một cú pháp tẻ nhạt. –

+0

Chưa kể đến trực quan. –

5

@ Câu trả lời của Fantattitude cung cấp những gì bạn muốn. Nhưng tôi mất một lúc để xem tài liệu để tìm hiểu số lý do tại sao. Để lâu trở thành một bình luận, vì vậy đây là tài liệu tham khảo:


Theo Ngôn ngữ lập trình Swift (Swift 3) Expressions Chương

Khi biểu hiện ở phía bên tay trái của một nhà điều hành nhị phân được đánh dấu là thử, thử ?, hoặc thử !, toán tử đó áp dụng cho biểu thức nhị phân toàn bộ.

Thứ nhất, tôi nghĩ as thể không là một nhà điều hành nhị phân, nhưng trong Swift Standard Library Operators

as, as?, và as! là Infix nhà khai thác vận hành

và trong Operator Declaration chương

Một ghi vào điều hành là một nhị phân điều hành được bằng văn bản giữa hai toán hạng của nó, chẳng hạn như các nhà điều hành Ngoài quen thuộc (+) trong biểu thức 1 + 2.

+0

Điều tra tuyệt vời! –

+0

Hmm. Tôi vẫn còn một chút bối rối về các chi tiết kỹ thuật này. Nếu nó đang thực thi mã cho App.mainQueueContext.fetch() và đưa kết quả đến [Expense] trước khi nó cố gắng đánh giá/áp dụng thử? - Điều này không nên ném một lỗi về việc chạy mã mà ném mà không có bất kỳ loại xử lý lỗi nào? – Cognitio

+0

Không có thời gian để đi qua tài liệu, nhưng tôi đoán 'as' có tuyên truyền lỗi/ném. – zcui93

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