2016-12-05 74 views
0

我有这个奇怪的错误消息,在我的TableViewController类不能下标类型的值“INOUT [菜单项]”(又名“INOUT阵列<MenuItem>”)

class MenuTableViewController: UITableViewController { 
fileprivate var menuItems = [MenuItem]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.register(UINib(nibName: "MenuItemTableViewCell", bundle: nil), forCellReuseIdentifier: CELL_MENU_ITEM) 
} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return menuItems.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: CELL_MENU_ITEM, for: indexPath) as! MenuItemTableViewCell 

    // this line throws the error message 
    if let menuItem = self.menuItems[indexPath.row].getTitle() as [MenuItem] { 
     cell.itemTitleLabel.text = menuItem 
    } 


    return cell 
} 

func setMenuItems(menuItems: [MenuItem]) { 
    self.menuItems = menuItems 
}  
} 

我完全不知道是什么错误的手段。还有其他人正在用type inout来面对这个问题,但他们正在用'='而不是'=='和类似的东西来做错误。顺便说一句,menuItems的值在完成函数中的另一个类中被设置。但是,如果我从那里删除它,我仍然有这个错误。

回答

1

由于menuItems被声明为一个具体的非可选类型没有类型转换也不需要可选的绑定。

let menuItem = self.menuItems[indexPath.row] 
cell.itemTitleLabel.text = menuItem.getTitle() 

错误消息可能会引起误解。您正尝试将(假定)String设置为[MenuItem]

1

也许你想检查MenuItem?这样的:

if let menuItem = self.menuItems[indexPath.row] as MenuItem { 
    cell.itemTitleLabel.text = menuItem.getTitle() 
} 

你申报你的收藏与[MenuItem]类型,因此订阅将返回非可选值,你可以删除iflet检查及用途:

cell.itemTitleLabel.text = self.menuItems[indexPath.row].getTitle()

+0

谢谢,我曾经这样做过,但它不工作。在vadian实施它的方式中,它是有效的。也许Xcode的错误,因为我认为你的/我的版本和他是一样的。无论如何非常感谢你! – Brudus

+0

@Brudus这是不一样的,Xcode没有错误。编译器不允许可选的绑定('如果let')应用于非可选类型。 – vadian

+0

是的,我知道你的意思,但我只是补充说,如果让因为另一个错误。我认为这是Xcode中的一个错误,但在重新访问它之后,它也可能是我的另一个错误。 – Brudus

0

我错过了在自定义结构中导入uikit并获得类似错误。希望它能帮助有人在这里读书。

相关问题