Быстрое частное управление доступом, вызывающее проблемы
Я работаю над приложением для iOS и использую Swift в этом. Для большей читабельности и организации функций я использовал расширения в моем файле swift.
// MARK: Class Declaration
class PaymentView
{
// Some stuffs
}
// MARK: Lifecycle methods
extension PaymentView
{
// Overriden for adding gesture recogniser
override func awakeFromNib()
{
super.awakeFromNib()
// Causes a crash when tapped on view
let tapGesture = UITapGestureRecognizer(target: self, action: Selector("paymentViewSelected:"))
self.addGestureRecognizer(tapGesture)
// Works correctly !!!
paymentViewSelected(tapGesture);
}
}
// MARK: Private Methods
extension PaymentView
{
private func paymentViewSelected(sender : UITapGestureRecognizer)
{
print("Method called")
}
}
Моя проблема, когда я нажимаю на мой взгляд, приложение падает с unrecognised selector
ошибка. Если я уберу это private
Спецификатор контроля доступа из метода работает отлично.
Мой вопрос, я могу позвонить paymentViewSelected:
прямо из awakeFromNib
независимо от private
, Но почему происходит сбой при использовании в качестве селектора?
Согласно Swift AccessControl Reference
Частный доступ ограничивает использование объекта собственным определяющим исходным файлом. Используйте частный доступ, чтобы скрыть детали реализации определенного компонента.
Но мой класс, расширение, жест - все в одном файле. Я думаю, что мне не хватает некоторой базовой концепции ключа здесь. Пожалуйста, помогите мне понять проблему.
2 ответа
По поводу вашей точки зрения: я могу вызвать paymentViewSelected: напрямую из awakeFromNib независимо от приватности. Но почему происходит сбой при использовании в качестве селектора?
Это потому, что методы, которые отмечены private
может быть доступен внутри класса, но объект класса не может вызвать метод, помеченный private
,
В вашем tapGesture он вызывается с использованием объекта класса автоматически, когда вы нажимаете на представление. В этом случае ваш метод недоступен, потому что он помечен private
, это причина ошибки сбоя unrecognised selector
,
Если вы вызываете метод из селектора, и он является закрытым, их нельзя вызвать, потому что метод вызывается извне. Когда вы звоните paymentViewSelected()
в awakeFromNib он вызывается внутри класса. Однако когда он вызывается через селектор, он вызывается извне. лайк object.paymentViewSelected()
, Вы не можете вызывать закрытый метод извне.