【问题标题】:Swift2.0 Downcast and Redundant error [duplicate]Swift2.0 Downcast 和 Redundant 错误 [重复]
【发布时间】:2016-03-23 00:16:10
【问题描述】:

这是代码。

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

这会导致这样的错误。 “'UITabBarItem 的失望?”到 'UITabBarItem' 只解开选项;你们男人用过'!'吗?”

和冗余错误。这是代码

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

这会导致这样的错误。 “‘PrivateViewController’与协议‘UITableViewDataSource’的冗余一致性” 有谁知道解决办法吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

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

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

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

    2) UITableViewController 默认同时符合UITableViewDelegate 和UITableViewDataSource。在代码中删除两者。

    【讨论】:

    • 不应该把下标后面的bar项解开吗? (items?[1]!) 因为下标访问几乎肯定会返回一个可选的。
    • 我不这么认为,否则签名应该是[UITabBarItem?]?
    • 你是对的!下标访问不返回可选值,而是在索引超出范围时爆炸。
    【解决方案2】:

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

    (顺便说一句,这是一种称为泛型的东西,它与 Objective-C 时代有所不同。在 Objective-C 中,拥有一个数组会“剥离”这些东西的类型,所以我们经常不得不将它们转换为精确类型。在 Swift 中,数组“保留”存储在其中的内容的类型,因此当您从数组中获取项目时,编译器已经知道它的精确类型。顺便说一下,Apple has introduced a lightweight version of generics for Objective-C in Xcode 7 .)

    至于您的第二个问题,您的类继承自 UITableViewController 已经符合 UITableViewDelegate 和 UITableViewDataSource,因此再次声明符合性没有意义。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多