2016-11-30 18 views
5

Tôi đang cập nhật dự án lên Swift 3 và gặp phải cảnh báo sau mà tôi không thể giải quyết được.Cảnh báo Swift 3: Biểu thức không bắt buộc của loại 'Chuỗi' được sử dụng trong kiểm tra tùy chọn

fileprivate var filteredTitlesList: [String] = [] 

if let filteredTitle: String = filteredTitlesList[indexPath.row] as String { // 'Non-optional expression of type 'String' used in a check for optionals' 

    // Do something 

} 

Câu trả lời cho một câu hỏi tương tự ở đây không giúp tôi: Non-optional expression of type 'AnyObject' used in a check for optionals

Cảm ơn rất nhiều!

+0

Từ 'filteredTitlesList' là một mảng của 'yếu tố chuỗi', bạn không cần phải làm một chuyển đổi của một phần tử trong mảng này thành kiểu phần tử riêng của nó. Hencem, bạn thực sự không cần phải ràng buộc tùy chọn ở đây. Nếu 'filterTitlesList' là một mảng của các phần tử' Any', bạn có thể thực hiện một chuyển đổi cố gắng ('as?') Trong một mệnh đề ràng buộc tùy chọn. – dfri

+0

Bạn có mảng 'String' và lấy item từ nó, là 'String', và sau đó đưa nó vào' String'. Và hy vọng nó sẽ là 'nil'. Tôi có đúng không? – user28434

+0

Bạn có một chuỗi các chuỗi, mà theo tuyên bố của nó - không bao giờ có thể là số không. Vì vậy, toàn bộ điều kiện 'if' không có ý nghĩa. – Codo

Trả lời

7

Bạn đang cố gắng mở một giá trị chưa được mở và do đó bạn gặp lỗi vì không cần mở lại. Thay đổi câu lệnh if của bạn trông giống như sau và bạn phải có màu vàng:

if filteredTitleList.count > indexPath.row { 
    let filteredTitle = filterdTitleList[indexPath.row] 
} 

Thật không may là không có cách nào để ràng buộc biến trong câu lệnh if, hy vọng sẽ không thêm biến trong câu lệnh if trong tương lai.

+0

Đây thường là một cách tiếp cận lành mạnh để kiểm tra ràng buộc trước khi truy cập mảng bằng cách lập chỉ mục rõ ràng, nhưng đối với trường hợp cụ thể của OP, trong đó một mảng là nguồn dữ liệu cho tableview, có vấn đề cơ bản trong nguồn dữ liệu này nếu 'indexPath.row 'là một chỉ mục phần tử không hợp lệ cho' filteringTitleList' (vì vậy đây sẽ là "sửa lỗi" cho một vấn đề thực sự ở nơi khác). – dfri

+0

@dfri Đồng ý, trong lý thuyết 'filterTitleList [indexPath.row]' không bao giờ vượt quá phạm vi của mảng, trừ khi bạn nói, nguồn dữ liệu hoàn toàn bị hỏng. Tuy nhiên, tôi khuyến khích viết mã an toàn vì vậy đó là một thói quen tốt để tạo ra. –

+0

Tôi đang kiểm tra xem có tồn tại một chuỗi tại đường dẫn chỉ mục đã cho hay không và nếu có, hãy gán chuỗi đó cho filterTitle. Nếu không, không nên làm gì cả. Xin lỗi vì sự thiếu hiểu biết của tôi nhưng tôi không hiểu tại sao điều này không an toàn khi sử dụng nếu để xây dựng. – nontomatic

0

khả năng khác của cảnh báo này là khi bạn đang cố gắng để đưa tuyên bố một ví dụ: let keyboardFrame: CGRect = keyboardFrameValue.cgRectValue trong bản Tuyên Bố có điều kiện như if hoặc guard

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