Swift最佳实践:如何跟踪不同的对象?

时间:2018-10-26 21:18:38

标签: swift code-structure

我想知道什么是跟踪相同类型不同对象的好方法。

我具有此功能:

private extension MenuButtonsViewController {
  // TODO: Find a way to find correct button based on MenuItem
  func buttonFor(for menuItem: MenuItem) -> EmojiButton? {
    guard let subViews = stackView.subviews as? [EmojiButton] else {
      return nil
    }
    let button = buttonFactory.makeEmojiButton(title: menuItem.icon)
    for subView in subViews where subView == button {
      return subView
    }
    return nil
  }
}

我有一个数组(UIStackView),其中按钮(EmojiButton)的数量不同。这些按钮是根据MenuItem中的内容创建的。 我正在寻找一种好的清洁方法,如何基于stackViewMenuItem数组中查找和删除特定按钮。

到目前为止,我有三个想法:

  • 要创建一个新对象,其初始值与要删除的对象相同,然后使用==进行匹配。 (以上解决方案)。这没用。
  • 要将id添加到所有按钮,然后将相应的id添加到MenuItem对象。但这似乎不是一个优雅的解决方案,必须将其添加到所有位置,并从按钮对象中公开此变量。
  • 也许将按钮与MenuItemButton一起存储在包装类中(例如id),或者通过存储MenuItem对象来与之匹配。

有什么想法吗?通常如何做?

1 个答案:

答案 0 :(得分:1)

如果MenuItemEmojiButton继承自UIView,则可以利用所有tag上可用的UIView属性。

您首先需要为每个tag分配一个唯一的MenuItem值。

然后,您需要将此相同的值分配给相应的表情符号按钮的tag属性。 (这将是在您工厂里做的一件好事。)

完成此操作后,您可以按如下所示修改函数:

//assumes MenuItem and EmojiButton inherit from UIView
func buttonFor(for menuItem: MenuItem) -> EmojiButton? {
    return stackView.viewWithTag(menuItem.tag) as? EmojiButton
}