Этот ответ очень похож на Bruno Hecktheuers, но вместо того, чтобы каждый, кто хочет соответствовать протоколу «Tappable», реализовал переменную «селектор», мы решили передать его в качестве параметра функции addTapGestureRecognizer:
protocol Tappable {
func addTapGestureRecognizer(selector selector: Selector)
func tapGestureDetected(gesture:UITapGestureRecognizer)
}
extension Tappable where Self: UIView {
func addTapGestureRecognizer(selector selector: Selector)
let gesture = UITapGestureRecognizer(target: self, action: selector)
addGestureRecognizer(gesture)
}
}
class TapView: UIView, Tappable {
func tapGestureDetected(gesture:UITapGestureRecognizer) {
print("Tapped")
}
}
, а затем просто передавайте селектор везде, где он используется:
addTapGestureRecognizer(selector: #selector(self.tapGestureDetected(_:)))
Таким образом, мы избегаем того, чтобы те, кто реализует этот протокол, должны были реализовывать переменную селектора, и мы также избегали отмечать всех используя этот протокол с "@objc". Чувствуется, что этот подход менее раздутый.
Я предлагаю использовать новый Java WURFL API для загрузки и просмотра базы данных возможностей. Это довольно гибкий способ, вы сможете довольно быстро реализовать свой псевдокод.
Я не знаю об API для этой задачи. Я сам сталкивался с этим и в итоге создал публичный сайт для решения этой задачи: http://wurfl.ditherandbicker.com/
Поскольку базовый XML-файл WURFL создан для переносимости, полная матрица возможностей устройства должна быть получена путем чтения из переменного числа "резервных устройств". Многие другие проекты на основе WURFL ведут себя так же. По моему опыту, вам действительно нужно перевести стандартную вложенную структуру данных в плоскую, если вы надеетесь получить достойную скорость поиска. Конечно, при этом теряются преимущества переносимости.