在游乐场,我正在创建一个简单的类:
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
对象作为参数而不是字符串传递。有没有人对此有任何想法。
答案 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
,您不提供调用该函数的实例。