【问题标题】:Swift private access control causing issuesSwift 私有访问控制导致问题
【发布时间】:2016-03-28 15:10:22
【问题描述】:

我正在开发一个 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 访问控制说明符,它会完美运行。

我的问题是,无论private,我都可以直接从awakeFromNib 调用paymentViewSelected:。但是为什么它在用作选择器时会崩溃?

根据Swift AccessControl Reference

私人访问将实体的使用限制在其自己的定义范围内 源文件。使用私有访问隐藏实现细节 一个特定的功能。

但我的课程、扩展名、手势都在同一个文件中。我想我在这里遗漏了一些基本的关键概念。请帮助我理解这个问题。

【问题讨论】:

标签: ios swift private uitapgesturerecognizer


【解决方案1】:

关于您的观点:我可以直接从 awakeFromNib 调用 paymentViewSelected: ,而不管是私有的。但是为什么它在用作选择器时会崩溃?

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

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

【讨论】:

    【解决方案2】:

    如果您从选择器调用方法并且它是私有的,则无法调用它们,因为该方法是从外部调用的。当您在 awakeFromNib 中调用 paymentViewSelected() 时,它会在类内部调用。但是,当它通过 Selector 调用时,它是从外部调用的。喜欢object.paymentViewSelected()。不能从外部调用私有方法。

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 2011-08-27
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2013-03-24
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多