如何改变数组中的值

How to mutate Values inside a Array

我需要改变以下数组:

struct Person {
    var name: String
    var age = 0
    }

func showPersonArray() -> [Person] {

    var dataArray = [Person]()

    dataArray.append(Person(name: "Sarah_Yayvo", age: 29))
    dataArray.append(Person(name: "Shanda_Lear", age: 45))
    dataArray.append(Person(name: "Heidi_Clare", age: 45))

    return dataArray
}

如何将 "name" 键拆分为两个键:"givenName" 和 "familyName"。 一些好人之前给了我这个代码:

let arraySeparated1 = dataArray.map { [=11=].substring(to: [=11=].range(of: "_")!.lowerBound) }
let arraySeparated2 = dataArray.map { [=11=].substring(from: [=11=].range(of: "_")!.upperBound) }

是否可以在结构内部进行突变? 函数 showPersonArray() 仅用于演示和测试。 也许有一种方法可以使用目标结构,如下所示:

struct Persontarget {
    var familyname: String
    var givenName: String
    var age = 0
}

struct Person: Array -> [Persontarget]  {
    var name: String
    var age = 0

    // Here the split/mutating code

    return [PersonWithTwoNames]
}

或使用字符串扩展名。可能我的问题听起来很新,但我整天都在尝试...... 谢谢大家!

为你的人 class 创建一个方法或计算机变量,returns 你想要什么。

func firstName() -> String {
    return self.substring(to: [=10=].range(of: "_")!.lowerBound)
}

虽然你不应该强制转换

我会在新的 Person 类型上写一个初始化器,它从旧的 person 类型(我称之为 LegacyPerson)初始化它:

import Foundation

struct LegacyPerson {
    let name: String
    let age: Int
}

func getPersonArray() -> [LegacyPerson] {
    return [
        LegacyPerson(name: "Sarah_Yayvo", age: 29),
        LegacyPerson(name: "Shanda_Lear", age: 45),
        LegacyPerson(name: "Heidi_Clare", age: 45)
    ]
}

struct Person {
    let familyName: String
    let givenName: String
    let age: Int
}

extension Person {
    init(fromLegacyPerson person: LegacyPerson) {
        let index = person.name.range(of: "_")!
        self.init(
            familyName: person.name.substring(from: index.upperBound),
            givenName: person.name.substring(to: index.lowerBound),
            age: person.age
        )
    }
}

let people: [Person] = getPersonArray().map(Person.init)

people.forEach{ print([=10=]) }

在扩展

中定义的计算属性的帮助下
struct Person {
    let name: String
    let age: Int
}

let person = Person(name: "Maria_Terezia", age: 300)

extension Person {
    var names:[String] {
        get {
            return name.characters.split(separator: "_").map(String.init)
        }
    }
}

for name in person.names {
    print(name)
}

打印

Maria
Terezia