当前位置:  开发笔记 > IOS > 正文

在Swift中使用Map来更改自定义结构属性

如何解决《在Swift中使用Map来更改自定义结构属性》经验,为你挑选了2个好方法。

我定义了以下结构.

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)
}

现在我尝试使用下面的代码将活动属性更改为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
}

Martin R.. 7

在两种情况下,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的答案.

单表达式闭包的示例:

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自动推断返回类型.

有关更多信息,请参阅Swift一书的"闭包"一章中的"从上下文中推断类型"和"单表达式闭包中的隐式返回 ".



1> Martin R..:

在两种情况下,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的答案.

单表达式闭包的示例:

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自动推断返回类型.

有关更多信息,请参阅Swift一书的"闭包"一章中的"从上下文中推断类型"和"单表达式闭包中的隐式返回 ".



2> Kametrixom..:

当使用参数括号使其var起作用时,您还必须输入返回类型:

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

    p.active = false
    return p
}

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有