如何在Swift中从选择器调用私有类函数。

时间:2015-05-04 09:59:27

标签: ios swift

目前我这样做,

将选择器调用为:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "startAnimation:", userInfo: loadingView, repeats: true)

选择器方法如下:

private class func startAnimation(timer:NSTimer){
    var loadingCircularView = timer.userInfo as UIView
}

我收到警告,应用程序崩溃了:

warning: object 0x67c98 of class ‘ClassName’ does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector +[ClassName startAnimation:]

4 个答案:

答案 0 :(得分:4)

1。您可以按照以下方式编写您的功能:

@objc private class func startAnimation() {}

dynamic private class func startAnimation() {}  // not recommended

当您将swift函数声明为动态时,您将其视为Objective-C函数(Objective-C跟随动态调度),或者我们可以说,该函数现在是一个动态调度函数,可以在Selector中调用。

但在这种情况下,我们只需要让这个函数有一个动态特征,所以声明它为 @objc 就足够了。

2. 如果您将函数编写为

@objc private func xxxxx(){}

NSTimer中的目标应为 self ,但如果您将函数编写为

@objc private class func xxxx(){} // Assuming your class name is 'MyClass'

NSTimer中的目标应为 MyClass.self

答案 1 :(得分:4)

如果将类函数更改为实例函数,可以使用它:

performSelector(Selector(extendedGraphemeClusterLiteral: "aVeryPrivateFunction"))

注意:请务必使用@objc标记您的私人功能:

@objc private func aVeryPrivateFunction(){
    print("I was just accessed from outside")
}

了解更多here

答案 2 :(得分:3)

您无法使用选择器调用私有方法。这就是将方法设为私有的重点,因此无法从外部访问它们。

您还发送了calc()的实例作为类方法的目标,这就是为什么它不起作用的原因。您需要发送一个类或从方法中删除类。

答案 3 :(得分:1)

当类声明解决了我的问题时添加NSObject。

价:NSTimer scheduledTimerWithTimeInterval and target is "class level function"

class MyClass:NSObject{}

并将方法调用为,

NSTimer.scheduledTimerWithTimeInterval(0.5, target: ClassName.self, selector: Selector("startAnimation"), userInfo: nil, repeats: true)

class func startAnimation(){}