2017-06-12 29 views
-1

我需要變異以下數組中:如何變異值的陣列

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 
} 

我怎麼可能 - 鍵分裂「名」成兩個鍵:「給定名稱」和「familyName」。 一些不錯的人給了我在此之前代碼:

let arraySeparated1 = dataArray.map { $0.substring(to: $0.range(of: "_")!.lowerBound) } 
let arraySeparated2 = dataArray.map { $0.substring(from: $0.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] 
} 

或用字符串擴展。可能我的問題聽起來很新奇,但我想整個一天... 謝謝大家!

+1

您應該使用數組文字而不是重複'.append'調用。它更短,更簡單(請參閱我的回答) – Alexander

回答

1

我會寫上新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($0) } 
+0

非常感謝。我必須弄清楚。我沒有真正訪問getPersonArray函數。因爲最初它是json中的一個web查詢。但看起來我可以用這個工作。 –

+0

所以我必須在我的web-json請求中實現Person Extension? –

+0

@JoschHazard我不知道,因爲我不知道你的代碼是什麼樣的。我會按照你給我看的東西出發。 – Alexander

0

爲您的Person類創建一個方法或計算機變量,以返回您想要的內容。

func firstName() -> String { 
    return self.substring(to: $0.range(of: "_")!.lowerBound) 
} 

你不應該強制投雖然

0

在擴展中定義的計算屬性的幫助下

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