2017-08-31 89 views
1

創建對象/實例,我不知道如何使用創建實例或斯威夫特adressing他們當變量: 對於〔實施例我怎麼在一個循環做以下(創建實例):變量迅速

class Guest { 
    let name: String 
    var age: Int 
    init(name: String, age: Int) { 
     self.name = name 
     self.age = age 
    } 
} 

let guests = [["ann", 1] , ["bob", 2] ...] 

使迴路等於:

let ann = Guest(name: "ann" , age: 1) 
let bob = Guest(name: "bob" , age: 2) 
... 

編輯:我正在尋找這樣的事情:

for i in guests { 
    let i[0] = Guest(name: i[0] , age: i[1]) 

舉例adressing:

print(guests[0].age) 
>>>1 

我搜索了很多,但我得到針對關於類創建變量的問題。

非常感謝!

+0

你的問題很模糊,請嘗試編輯它,所以我們可以幫助你。 –

+0

您發佈的循環應該可以工作。你試過了嗎? – PeejWeej

+0

@PEEJWEEJ是的我試過了,swift終端引發以下錯誤:repl.swift:11:10:錯誤:連續的語句必須用';'隔開 那裏的「錯誤指針」指向「我[0]」讓我[0] = .... – sryimnew

回答

1

你可以做到這一點與經典的循環:

let input = [("Ann", 1), ("Bob", 2)] 

var guests: [Guest] = [] 
for each in input { 
    guests.append(Guest(name: each.0, age: each.1)) 
} 

但是,它可以更簡潔完成(並與var迴避)使用功能技術:

let guests = [("Ann", 1), ("Bob", 2)].map { Guest(name: $0.0, age: $0.1) }

編輯:基於字典的解決方案(Swift 4; Swift 3版本僅使用經典循環)

let input = [("Ann", 1), ("Bob", 2)] 
let guests = Dictionary(uniqueKeysWithValues: input.map { 
    ($0.0, Guest(name: $0.0, age: $0.1)) 
}) 

或者,如果有可能的兩位嘉賓有相同的名字:

let guests = Dictionary(input.map { ($0.0, Guest(name: $0.0, age: $0.1)) }) { first, second in 
    // put code here to choose which of two conflicting guests to return 
    return first 
} 

有了字典,你可以這樣做:

if let annsAge = guests["Ann"]?.age { 
    // do something with the value 
} 
+0

我將完全拋棄foreach循環 – Alexander

+0

我想通過對比來展示功能方法的更加簡潔。 –

+0

關閉:) - 但我還沒有Ann.age – sryimnew

0
//MARK: Call method to create multiple instances 

createInstance([("Ann", 1), ("Bob", 2)]) 

func createInstance(_ input: Array<Guest>) {   
    for each in input { 
     guests.append(Guest(name: each.0, age: each.1)) 
    } 
}