Быстрое частное управление доступом, вызывающее проблемы

Я работаю над приложением для 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(), Вы не можете вызывать закрытый метод извне.

Другие вопросы по тегам