将 UIBarButtonItem 转换为 UIButton

Casting a UIBarButtonItem to a UIButton

如果我想将 UIToolbar 项转换为 UIBarButtonItem,XCode 让我这样写:

    for item in toolBar!.items as! [UIBarButtonItem]! {
        // Do something
    }

但是,一旦它这样做,它就会说

"Forced cast from '[UIBarButtonItem]?' to '[UIBarButtonItem]' only unwraps optionals; did you mean to use '!'?"

那么,如何将上述转换写入 UIBarButtonItem 而不 XCode 显示任何 errors/warnings?

您可以使用 if let 进行安全类型转换。

    if let items = toolBar.items {

        for item in items {
            if let btn = item as? UIButton {
                print("'btn' is UIButton.")
            } else {
               print("It is not UIButton.")
            }
        }
    }

你可以检查是否有项目然后做一个foreach。

// check if toolBar have any items
guard let items = toolBar.items else { return }
// then do a loop with items
for item in items {
    // do something
}

你也可以用??提供默认值

// provide an empty array if items where nil
for item in toolBar.items ?? [] {
    // do something
}

你的警告是说你没有改变 class(类型转换),而只是 force-unwrapping。在您的情况下,toolBar!.items[UIBarButtonItem]? 的一种类型,您正在将其转换为 [UIBarButtonItem],这可以简单地通过说 toolBar!.items!.

来完成

但这与您在标题中提到的UIButton无关。并且您不能将 UIBarButtonItem 类型转换为 UIButton。两者之间有很大的区别,因为 UIBarButtonItem 实际上是创建按钮的指令,而不是按钮本身。如果您确实需要获取该按钮,则需要使用 UIBarButtonItem(customView: ) 将其添加为自定义视图,然后将其提取为 item.customView as? UIButton.

看看declaration of items

var items: [UIBarButtonItem]? { get set }

UIBarButtonItem的可选数组,不需要强制转换。这就是警告所说的。

只要安全地检查是否有物品,UIButton根本不涉及

if let bar = toolBar, let items = bar.items {
   for item in items {
      // Do something
   }
}

但是,如果工具栏及其项目是在 Interface Builder 中设计的并且不会在运行时更改,您可以强制展开两者。

   for item in toolBar!.items! {
      // Do something
   }

没有任何 if / guard let 或 force unwrapping 的简单方法是使用 forEach 代替:

toolbar.items?.forEach { item in
    // do whatever you want
}