尝试调用分配给函数的变量时出错

时间:2016-06-30 02:22:01

标签: ios swift function variables swift2

在游乐场,我正在创建一个简单的类:

class myClass {

    let name: String
    let text: String?

    var placeHolder = myfunc

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    func  myfunc(string: String) -> String {
        print("you passed \(string)")

        return " "
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}

我通过

使用名为myFunc的变量调用placeHolder
test!.placeHolder("this is a test")

但是,我收到此错误

cannot convert value of type 'String' to expected argument type 'myClass'

但是,如果我从var placeHolder = myfunc移除myClass并执行此操作

class myClass {

    let name: String
    let text: String?

    // Remove this line
    // var placeHolder = myfunc

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    func  myfunc(string: String) -> String {
        print("you passed \(string)")

        return ""
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}

var test: myClass? = myClass(name: "p", text: "hello, world")

let placeHoder = test!.myfunc
placeHoder("this is test")

它会起作用

我真的不明白为什么我必须在第一种情况下将myClass对象作为参数而不是字符串传递。有没有人对此有任何想法。

1 个答案:

答案 0 :(得分:2)

如果您选项 - 点击placeHolder,您会看到其类型:

var placeHolder: (myClass) -> (String) -> String

这意味着,如果您为placeHolder提供myClass个实例,则会返回(String) -> String类型的函数。

这是在对象上调用实例方法的方法。您可以通过提供对象的实例来调用该函数。

通常你会像这样打电话给myFunc

test!.myfunc("this is a test")

但这相当于:

myClass.myfunc(test!)("this is a test")

所以,您可以像这样使用placeHolder

test!.placeHolder(test!)("this is a test")

如果您使myfunc成为static函数:

static func myfunc(string: String) -> String {
    print("you passed \(string)")

    return ""
}

然后更改placeHolder以引用它:

var placeHolder = myClass.myfunc

然后你可以这样称呼它:

test!.placeHolder("this is a test")

因为作为static func,您不提供调用该函数的实例。