Вы можете легко добавить расширение на 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
, потому что вычисляемое свойство не может создать свой собственный общий контекст, как метод.)