我正在尝试快速学习并且遇到了闭包问题,但我仍然有一个问题要问,在互联网上找不到任何答案,我不确定在这里提问是否合适,但我真的需要对此的回答。
说我们有以下课程
class Human{
var gender:String?
private func fCheckGender(pGender:String?){
guard pGender != nil else {
print("Gender not specified")
return
}
if pGender == "M"{
print("Male")
}
else if pGender == "F"{
print("Female")
}
else{
print("gender Unknown")
}
}
private func cCheckGender( pGender:@autoclosure ()->(String?)){
guard pGender() != nil else {
print("Gender not specified")
return
}
if pGender() == "M"{
print("Male")
}
else if pGender() == "F"{
print("Female")
}
else{
print("gender Unknown")
}
}
func MyCheckGender(){
fCheckGender(pGender: gender)
cCheckGender(pGender: gender)
}
Run Code Online (Sandbox Code Playgroud)
}
var myHuman:Human = Human()
myHuman.gender = "M"
myHuman.MyCheckGender()
Run Code Online (Sandbox Code Playgroud)
我想知道两者的区别
fCheckGender 和 cCheckGender 我应该何时何地使用闭包
提前致谢!
PS 我故意使用了 void->String()->(String?)
我只想了解这种情况下的区别。我很抱歉我的英语不好
fCheckGender和之间的区别cCheckGender:fCheckGender将一个String 值作为参数。cCheckGender 将闭包作为参数。 cCheckGender被调用时,闭包被传递了一个参数,此时闭包只作为参数传递,闭包并没有被执行。只有在函数内部使用闭包参数时,闭包才会被执行。您所陈述的示例可能不是展示差异的最佳示例。
让我们考虑一个不同的例子:
func add(a: Int, b: Int) -> Int {
print("add")
return a + b
}
func f1(pValue: Int) {
print("f1")
print("value = \(pValue)")
}
func f2(pClosure: (Int, Int) -> Int, pA: Int, pB: Int) {
print("f2")
let value = pClosure(pA, pB)
print("value = \(value)")
}
//In autoclosure the closure always takes no parameters, because the closure is packaged with parameter values while invoking
func f3(pClosure: @autoclosure () -> Int) {
print("f3")
let value = pClosure()
print("value = \(value)")
}
f1(pValue: add(a: 10, b: 20))
print("=====================\n")
f2(pClosure: add, pA: 10, pB: 20)
print("=====================\n")
f3(pClosure: add(a: 10, b: 20))
print("=====================\n")
Run Code Online (Sandbox Code Playgroud)
add
f1
value = 30
=====================
f2
add
value = 30
=====================
f3
add
value = 30
=====================
Run Code Online (Sandbox Code Playgroud)
f3first 接受一个闭包作为参数。f3,然后检查f2。add到函数f2调用它的时间。add并捕获其参数的值时。正如 Hamish 所指出的,请阅读关于闭包的内容,然后是来自https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html 的自动闭包
| 归档时间: |
|
| 查看次数: |
1385 次 |
| 最近记录: |