gpt4 book ai didi

ios - 如何使用 map 在 Swift 中改变结构?

转载 作者:搜寻专家 更新时间:2023-10-30 22:25:14 26 4
gpt4 key购买 nike

我定义了以下结构。

struct Person {

var firstName :String
var lastName :String
var active :Bool
}

我创建了一个 Person 集合,如下所示:

var persons :[Person] = []

for var i = 1; i<=10; i++ {

var person = Person(firstName: "John \(i)", lastName: "Doe \(i)", active: true)
persons.append(person)
}

现在我尝试使用以下代码将 active 属性更改为 false:

let inActionPersons = persons.map { (var p) in

p.active = false
return p
}

但是我得到以下错误:

Cannot invoke map with an argument list of type @noescape (Person) throws

有什么想法吗?

解决方案:

看起来 Swift 有时无法推断类型,这有点蹩脚!这是解决方案:

let a = persons.map { (var p) -> Person in

p.active = false
return p
}

这行不通:

let a = persons.map { p in

var p1 = p
p1.active = false
return p1
}

最佳答案

Swift 编译器在两种情况下推断返回自动关闭的类型:

  • “单表达式闭包”中,即闭包体仅包含一个表达式(有或没有显式闭包参数)。
  • 如果类型可以从调用上下文中推断出来。

这些都不适用于

let inActionPersons = persons.map { (var p) in
p.active = false
return p
}

let a = persons.map { p in
var p1 = p
p1.active = false
return p1
}

这就是为什么您必须明确指定返回类型,如 Kametrixom's answer .

单表达式闭包示例:

let inActionPersons = persons.map { p in
Person(firstName: p.firstName, lastName: p.lastName, active: false)
}

并且它会用 (var p) in(p : Person) in 编译,所以这与是否给出闭包参数无关是否明确在括号中。

这是一个从调用中推断出类型的例子上下文:

let a : [Person] = persons.map { p in
var p1 = p
p1.active = false
return p1
}

map()的结果必须是一个[Person]数组,所以map需要Person -> Person 类型的闭包,编译器推断自动返回类型 Person

有关详细信息,请参阅“从上下文推断类型”和“从单表达式闭包隐式返回” "Closures" Swift 书中的章节。

关于ios - 如何使用 map 在 Swift 中改变结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113457/

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