Использование перечисления Swift для просмотра номеров тегов без rawValue - PullRequest
0 голосов
/ 10 января 2019

У меня есть целочисленное перечисление, которое я хотел бы использовать для числа viewWithTag(_:), но оно выдает мне ошибку "Невозможно преобразовать значение типа 'viewTags' в ожидаемый тип аргумента 'Int'", хотя оба enum и номер тега, необходимый для viewWithTag(_:), равен Int.

Это довольно просто, и я могу заставить его работать, если использую свойство rawValue, но это более грязно и громоздко, чем хотелось бы.

enum viewTags: Int {
    case rotateMirroredBtn
    case iPhone6SP_7P_8P
    case iPhoneX_Xs
    case iPhoneXs_Max
    case iPhone_Xr
    case unknown
}

// error on if statement "Cannot convert value of type 'viewTags' to expected argument type 'Int'"
if let tmpButton = self.view.viewWithTag(viewTags.rotateMirroredBtn) as? UIButton { 
    tmpButton.removeFromSuperview()
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Единственное, чего вам не хватает, это rawValue. Просто замените viewTags.rotateMirroredBtn на viewTags.rotateMirroredBtn.rawValue вот так:

if let tmpButton = self.view.viewWithTag(viewTags.rotateMirroredBtn.rawValue) as? UIButton { 
    tmpButton.removeFromSuperview()
}
0 голосов
/ 10 января 2019

Вы можете легко добавить расширение на UIView, чтобы сделать преобразование для вас. Вам просто нужно использовать универсальный параметр, чтобы ограничить аргумент чем-то, из чего вы можете получить Int.

extension UIView
{
    /**
     Returns the view’s nearest descendant (including itself) whose `tag`
     matches the raw value of the given value, or `nil` if no subview
     has that tag.
     - parameter tag: A value that can be converted to an `Int`.
     */
    func firstView <Tag : RawRepresentable> (taggedBy tag: Tag) -> UIView?
        where Tag.RawValue == Int
    {
        let intValue = tag.rawValue
        return self.viewWithTag(intValue)
    }
}

Ограничение T : RawRepresentable where T.RawValue == Int может быть выполнено вашим перечислением Int.

Не универсальная форма тоже проста: func firstView(taggedBy viewTag: ViewTag) -> UIView?

Бонус, вы также можете добавить метод к применить необработанное значение "составного" значения к представлению:

func applyTag <Tag : RawRepresentable> (_ tag: Tag)
    where Tag.RawValue == Int
{
    self.tag = tag.rawValue
}

(К сожалению, нет способа записать это как свойство, например, var composedTag: Tag where Tag : RawRepresentable, Tag.RawValue == Int, потому что вычисляемое свойство не может создать свой собственный общий контекст, как метод.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...