2015-06-24 15 views
76

Tôi cố gắng để xóa một hàng từ nguồn dữ liệu của tôi và các dòng mã sau đây:có điều kiện ràng buộc: nếu lỗi let - Initializer cho có điều kiện ràng buộc phải có tùy chọn loại

if let tv = tableView { 

gây lỗi sau:

Initializer for conditional binding must have Optional type, not UITableView

đây là mã đầy đủ:

// Override to support editing the table view. 
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 

     // Delete the row from the data source 

    if let tv = tableView { 

      myData.removeAtIndex(indexPath.row) 

      tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

Làm thế nào tôi nên sửa fol hạ thấp?

if let tv = tableView { 
+4

vì 'tableView' không phải là giá trị tùy chọn, không cần kiểm tra xem nó có phải là không. Vì vậy, bạn có thể trực tiếp sử dụng nó, tôi có nghĩa là loại bỏ 'nếu let' và chỉ sử dụng' tableView' trong hàm –

+0

Xin chào, Manny cảm ơn bạn đã trả lời. –

+0

Đối với hậu thế, sau khi tôi khắc phục vấn đề này, tôi chạy vào 'biến với getter/setter không thể có giá trị ban đầu', được giải quyết bằng cách loại bỏ khối {} còn lại sau khi khởi tạo, ala câu trả lời này: http: // stackoverflow .com/a/36002958/4544328 –

Trả lời

145

if let/if var tùy chọn ràng buộc chỉ hoạt động khi kết quả của phía bên phải của biểu thức là một tùy chọn. Nếu kết quả của phía bên phải không phải là tùy chọn, bạn không thể sử dụng liên kết tùy chọn này. Điểm của ràng buộc tùy chọn này là kiểm tra nil và chỉ sử dụng biến nếu không phải là nil.

Trong trường hợp của bạn, thông số tableView được khai báo là loại không bắt buộc UITableView. Nó được đảm bảo không bao giờ là nil. Vì vậy, tùy chọn ràng buộc ở đây là không cần thiết.

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 
     // Delete the row from the data source 
     myData.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

Tất cả chúng ta phải làm là để loại bỏ các if let và thay đổi bất kỳ lần xuất hiện của tv bên trong nó chỉ tableView.

11

cho vấn đề cụ thể của tôi, tôi đã phải thay thế

if let count = 1 
    { 
     // do something ... 
    } 

Với

let count = 1 
if(count > 0) 
    { 
     // do something ... 
    } 
+1

Câu trả lời hay nhất của anh chàng này, hãy xem các bình luận https://stackoverflow.com/a/31039427/2797944 –

7

Tương tự áp dụng cho bảo vệ báo cáo. Thông báo lỗi tương tự dẫn tôi đến bài đăng và trả lời này (cảm ơn @nhgrif).

Mã: Chỉ in tên cuối cùng của người đó nếu tên đệm dưới bốn ký tự.

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) { 
guard let Name = name.last where name.middle?.characters.count < 4 else { 
    print("Hi there)") 
    return 
} 
print("Hey \(Name)!") 

}

Cho đến khi tôi tuyên bố cuối cùng như một tham số tùy chọn Tôi đã nhìn thấy những lỗi tương tự.

4

điều kiện ràng buộc phải có loại optinal đó có nghĩa là bạn chỉ có thể liên kết các giá trị bắt buộc nhập nếu chúng ta hãy tuyên bố

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 

    if editingStyle == .delete { 

     // Delete the row from the data source 

     if let tv = tableView as UITableView? { 


     } 
    } 
} 

này sẽ hoạt động tốt nhưng chắc chắn rằng khi bạn sử dụng nếu để cho nó phải có loại optinal "?"

2

Trong trường hợp bạn đang sử dụng một loại tế bào tùy chỉnh, nói ArticleCell, bạn có thể nhận được một lỗi nói rằng:

Initializer for conditional binding must have Optional type, not 'ArticleCell' 

Bạn sẽ nhận được lỗi này nếu dòng code của bạn trông giống như sau:

if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

Bạn có thể sửa lỗi này bằng cách làm như sau:

if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell? 

Nếu bạn kiểm tra ở trên, bạn sẽ thấy rằng sau này đang sử dụng tùy chọn đúc cho một ô của loại ArticleCell.

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