2014-09-22 19 views
7

Tôi đang tải danh sách các đối tượng từ cơ sở dữ liệu lõi vào một chế độ xem bảng.[AnyObject]? ' không có thành viên có tên 'subscript'

class ScheduleViewController: UITableViewController { 

    private var items: [AnyObject]? 

    // MARK: - Table view data source 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if let itemCount = items?.count { 
      return itemCount 
     } 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("DayScheduleCell", forIndexPath: indexPath) as DayScheduleCell 

     if let act = items[indexPath.row] as Activity { 
      if act.client != nil { 
       // ... 
      } 
     } 

     return cell 
    } 
} 

Dữ liệu được lấy ra bên trong một đóng cửa vì vậy tôi đã tuyên bố một mảng items như một tùy chọn, vì nó có thể là con số không trong thời gian đầu tiên.

Tôi gặp lỗi '[AnyObject]?' không có thành viên có tên 'subscript' tại dòng này if let act = items[indexPath.row] as? Activity.

Tôi không thể tìm ra cách giải quyết vấn đề này.

Trả lời

21

Mảng được khai báo là:

private var items: [AnyObject]? 

như vậy, như bạn cũng biết, nó là một tùy chọn

Trong nhanh chóng một optional là một enum, do đó, một kiểu ngày của riêng mình - và như một tùy chọn , nó có thể chứa giá trị nil hoặc một đối tượng thuộc loại được chứa.

Bạn muốn áp dụng subscript để mảng, không để các tùy chọn, vì vậy trước khi sử dụng nó, bạn phải unwrap mảng từ tùy chọn

items?[indexPath.row] 

nhưng đó không phải là tất cả - bạn cũng phải sử dụng nhìn xuống có điều kiện:

as? Activity 

vì biểu thức trước có thể đánh giá để nil

vì vậy, cách chính xác để viết câu lệnh if là

if let act = items?[indexPath.row] as? Activity { 
+0

Cảm ơn bạn đã trả lời. Tôi nhận được một lỗi mới ** Không thể gọi '! =' Với một danh sách đối số của kiểu '(@lvalue Client, NilLiteralConvertible)' ** tại dòng 'if act.client! = Nil'. Thuộc tính máy khách là thuộc tính chứa đối tượng 'Client'. Vui lòng xem 'NSManagedObject' [subclass] (http://pastie.org/9584414#) của' Activity'. Trong Mô hình Dữ liệu, kiểm tra dưới các thuộc tính cho máy khách, mặc dù nó được chọn là tùy chọn. – Isuru

+0

'client' không phải là một tùy chọn, và vì vậy nó không thể là' nil' - do đó bạn không thể kiểm tra nếu nó không phải là không.'If' là khái niệm dư thừa và dĩ nhiên được coi là lỗi cho trình biên dịch – Antonio

+0

Vì vậy, theo câu hỏi [this] (http://stackoverflow.com/q/25485273/1077789), mặc dù các thuộc tính được đánh dấu tùy chọn trong Dữ liệu cốt lõi, nó không được đề cập trong các lớp 'NSManagedObject' được tạo ra. Bạn phải thêm thủ công. Tôi đã thêm một '?' Vào trước thuộc tính của máy khách và bây giờ nó hoạt động tốt. – Isuru

2

Trước hết bạn cần phải unwrap hoặc chuỗi tùy chọn các mặt hàng như nó có thể được nil. AnyObject có hành vi khác nhau khi nhận được như là yếu tố từ mảng, do thực tế là AnyObject có thể là một chức năng. Bạn sẽ phải đúc từ mục như thế này:

if let act = items?[indexPath.row] as AnyObject? as Activity? { 
    if act.client != nil { 
     // ... 
    } 
} 

Nếu items sẽ không bao giờ chứa một hàm bạn có thể sử dụng

private var items: [Any]? 

thay vào đó và dàn diễn viên với:

if let act = items?[indexPath.row] as? Activity { 
    if act.client != nil { 
     // ... 
    } 
} 
+0

Cảm ơn bạn đã trả lời. Nhưng tiếc là tôi vẫn gặp lỗi tương tự ở cùng một dòng. – Isuru

+0

Xin lỗi, tôi có lỗi đánh máy. Thử ngay bây giờ. – Kirsteins

+0

Lỗi đó đã biến mất. Nhưng tôi gặp lỗi mới ** Không thể gọi '! =' Với danh sách đối số của loại '(@lvalue Client, NilLiteralConvertible)' ** tại dòng 'if act.client! = Nil' – Isuru

1

Tôi đã cố định của tôi vấn đề bằng cách chuyển đổi loại chỉ mục var từ UInt thành Int

let obj = items[Int(index)] 

Hy vọng điều này có thể giúp ai đó vẫn gặp phải vấn đề này.

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