gpt4 book ai didi

Swift map 语义

转载 作者:搜寻专家 更新时间:2023-11-01 06:46:20 28 4
gpt4 key购买 nike

我有以下代码。

        let v_blue = UIView()
v_blue.backgroundColor = UIColor.blueColor()
let v_red = UIView()
v_red.backgroundColor = UIColor.redColor()
let v_green = UIView()
v_green.backgroundColor = UIColor.greenColor()

然后做:(因为 [].iter 不存在,我正在做一个 map 只是为了副作用)

[v_blue, v_red, v_green].map({
(v: UIView) in
v.setTranslatesAutoresizingMaskIntoConstraints(false)})

可以正常工作,但下面的不行。

 [v_blue, v_red, v_green].map({
(v: UIView) in
v.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(v)})

错误“无法使用类型为‘(UIView) -> _) 的参数列表调用‘map’”

好吧好吧,那我试试

[v_blue, v_red, v_green].map({
(v: UIView) in
v.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(v)
return ()}) // return v also doesn't work

这仍然不起作用,因为我得到了同样的错误。我对此感到困惑。

最佳答案

纯粹为了副作用而使用 map 通常被认为是不好的形式——改用 for...in 循环:

for view in [v_blue, v_red, v_green] {
view.setTranslatesAutoresizingMaskIntoConstraints(false)
// etc
}

除了在风格上更好之外,不将 map 仅用于循环目的的原因是 map 创建一个数组——这就是它的目的。所以你传递给它的闭包必须返回一个值。

这就是为什么你的第二个例子不起作用——当闭包只包含一个表达式时,该表达式的结果从闭包中隐式返回。因此,您的 map 正在创建类型为 [Void] 的数组。

但是当闭包中有两个或多个表达式时,你必须放入一个显式的return。所以这应该有效:

[v_blue, v_red, v_green].map { (view: UIView)->Void in
view.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(view)
return ()
}

额外的输入应该可以解决您可能遇到的任何歧义问题( View 数组是 [UIView] 还是 NSarray?)最后一个例子中的问题。

但希望此时您清楚地知道您不想使用 map。您可以编写一个 foreach 方法作为数组的扩展,但老实说,这有什么意义呢?只需使用 for 循环。

关于Swift map 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com