swift 如何将一个以闭包为参数的Void函数转换为闭包?

idfiyjo8  于 2023-04-04  发布在  Swift
关注(0)|答案(3)|浏览(115)

这是我在下面的功能:

func myFunction(value: (String) -> Void) {
    value("Hello")
}

使用情况:

myFunction(value: { newValue in
     print(newValue)
})

我想把这个函数转换成一个闭包:
我做了这个:

typealias Action = () -> Void

let myClosure: (Action) -> Void = { action in
    action()
}

用例是:

myClosure {
    print("Hello")
}

但是正如你所看到的,myClosure不能设置字符串,我希望能够执行以下代码:

myClosure { newValue in
    print(newValue)
}

需要帮助来解决这个狡猾的代码。

ercv8c1e

ercv8c1e1#

你只需要在Action typealias中添加一个泛型类型参数:

typealias Action<T> = (T) -> Void

myClosure的定义如下:

let myClosure: Action<String> = { newValue in
    print(newValue)
}
myClosure("hello")
myClosure("world")
输出

你好
世界

sczxawaw

sczxawaw2#

你只需要对你的“闭包”尝试做一个小的改变,就可以复制你的“函数”方法。
您需要在typealias中添加一个String参数,然后在调用action时传递一个字符串:

typealias Action = (String) -> Void // Add the String parameter

let myClosure: (Action) -> Void = { action in
    action("Hello") // Call action with a string
}

现在,当您这样做时:

myClosure { newValue in
    print(newValue)
}

你会得到输出:
你好

yzckvree

yzckvree3#

直觉

  • 就像myFunction接受一个以string为输入并返回void的闭包一样,myClosure也应该这样做。
  • 稍后,通过将print函数作为参数传递给myClosure,我们可以打印字符串Hello
    代码
typealias Action = (String) -> Void

let myClosure: (Action) -> Void = { action in
    action("Hello")
}

myClosure { arg in
    print(arg)
}

相关问题