Swift私有访问控制导致问题

时间:2015-12-22 11:04:24

标签: ios swift private uitapgesturerecognizer

我正在使用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 个答案:

答案 0 :(得分:1)

关于你的观点:我可以直接从awakeFromNib调用paymentViewSelected:无论是私有的。但是当它用作选择器时为什么会崩溃?

因为标有private的方法可以在类中访问,但是类的对象不能调用标有private的方法。

在tapGesture中,一旦点击视图,就会自动使用类对象调用它。 在这种情况下,您的方法不可用,因为它标有private,这就是崩溃错误unrecognised selector的原因。

答案 1 :(得分:0)

如果从一个选择器调用一个方法并且它是私有的,则无法调用它们,因为该方法是从外部调用的。当你在awakeFromNib中调用paymentViewSelected()时,它会在类中调用。但是当它通过Selector调用时,它会从外部调用。比如object.paymentViewSelected()。你不能从外面打电话给私人方法。