Swift2.0 Downcast和Redundant错误

时间:2015-12-16 18:10:25

标签: swift

这是代码。

var item = self.tabBarController?.tabBar.items?[1] as! UITabBarItem

这会导致这样的错误。 "来自UITabBarItem的Downcast?"到' UITabBarItem'只打开选项;你是男人使用'!'?"

并且冗余错误。这是代码

class PrivateViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource, UIActionSheetDelegate, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate {}

这会导致这样的错误。 "' PrivateViewController'的冗余一致性到protocal' UITableViewDataSource" 谁知道解决方案?

2 个答案:

答案 0 :(得分:1)

1)在Swift 2中,items的属性UITabBar被声明为[UITabBarItem]?。 如果总有至少两个标签栏项目可以写

var item = self.tabBarController!.tabBar.items![1]

因为编译器知道类型。如果不使用适当的可选绑定。

2)UITableViewController默认符合UITableViewDelegateUITableViewDataSource。删除代码中的两个。

答案 1 :(得分:1)

好吧,UITabBarController的标签栏项目已经输入为UITabBarItem,因此将它们转换为相同类型是没有意义的。这是编译器所说的。唯一需要的是打开可选项,因为你没有得到真正的UITabBarItem,而是一个可选的UITabBarItem。如果您确定索引1下面有一个条形项,您可以强行打开它:self.tabBarController?.tabBar.items?[1]!

(顺便说一句,这是一个叫做泛型的东西,它与Objective-C时代产生了不同。在Objective-C中,有一系列东西会“剥离”这些东西的类型,所以我们经常不得不将它们转换为精确类型。在Swift中,数组“保留”存储在其中的事物的类型,因此当您从数组中获取项目时,编译器已经知道它的精确类型。顺便说一句,{{3 }}。)

关于您的第二个问题,您的类继承了UITableViewController已经符合UITableViewDelegateUITableViewDataSource的问题,因此再次声明一致性毫无意义。