Swift - 类型的值ViewController没有成员* functionName *

时间:2015-12-26 11:21:19

标签: ios swift function

在我的应用程序中,我有几个场景,每个场景都显示不同的UIAlertController,所以我创建了一个显示此警报的功能,但我似乎无法在"内部调用self.Function。 okAction" 。我收到此错误:

  

'ViewController'类型的值没有成员'doAction'

以下是代码:

func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : () )
{
    let refreshAlert = UIAlertController(title: titleOfAlert, message: messageOfAlert, preferredStyle: .Alert)

    let okAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) {
        UIAlertAction in

        self.doAction()
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default) {
        UIAlertAction in
    }

    refreshAlert.addAction(okAction)
    refreshAlert.addAction(cancelAction)

    self.presentViewController(refreshAlert, animated: true, completion: nil)
}

这是我打电话的其中一项功能:

func changeLabel1()
{
    label.text = "FOR BUTTON 1"
}

我该如何解决?

3 个答案:

答案 0 :(得分:13)

  1. 删除self前面的doAction(),因为您没有在对象上调用该操作。

  2. 如果您这样做,编译器会告诉您 Invalid use of '()' to call a value of non-function type '()'。情况就是这样,因为doAction不是函数,而是空元组。函数具有输入参数和返回类型。因此doAction的类型应为() -> Void - 它不需要输入并返回Void,即不返回任何内容。

  3. 代码应该是这样的:

    func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : () -> Void ) {
        ...
        let okAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) { action in
            doAction()
        }
        ...
    }
    

    如果您想将action传递给doAction方法,则必须将类型更改为(UIAlertAction) -> Void并通过doAction(action)进行调用。

答案 1 :(得分:1)

从您的代码 doAction 是函数的第三个参数 showAlertController

所以 第一步:将 doAction :()更改为 doAction :() - >() 这意味着doAction是Closure,没有参数和空返回。

第二:呼叫不应该是 self.doAction(),而只是 doAction() 因为它是一个参数而不是实例变量

答案 2 :(得分:0)

我认为指定闭包的正确方法是这样的:

func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : (() -> Void) ){

   // and then call it like that
   doAction()

}

这里的关键是你不能调用this.doAction(),因为传递给函数的参数不是控制器上的属性,对吧?