2017-10-07 82 views
0

Swift 4似乎正在實施不同的方法到(void)setValuesForKeysWithDictionary(),Swift 4中這個函數有什麼合適的替代?setValuesForKeysWithDictionary in Swift 4?

我有

struct User { 
    let name: String? 
    let email: String? 
} 

dictionaryOfUsers結構是從哪個值都動態地根據用戶的數據庫數量的數據結構來:

let dictionaryOfUsers = [{key1: "name1", key2 : "[email protected]"}, {key1 : "name2", key2 : "[email protected]"} ] 
let users = [User] 

現在我想用這個函數來創建我的用戶數組以在Swift 4中創建字典:

for dictionary in dictionaryOfUsers { 
    let user = User() 
    user.setValuesForKeysWithDictionary(dictionary) 

並追加到用戶

users.append(user) 
}  
+0

'key1'和'key2'代表什麼?我期望''name''和'''email''字符串代替... –

+0

是key1和key2是用於「name」和「email」的 –

回答

0

嘗試此方法來代替:

func setValuesForKeys(_ keyedValues: [String : Any]) 

接收機的屬性集合與來自給定字典中的值,利用其鍵來標識的屬性。默認實現調用setValue(_:forKey:)每個鍵值對...

您的代碼有許多小問題 - 一些重大問題,以及(見亞光答案獲取更多信息)。無論如何,我認爲這應該完成你所追求的:

import Foundation 

class User: NSObject { 
    @objc var name: String! 
    @objc var email: String! 
} 

let dictionaryOfUsers = [ 
    ["name": "name1", "email": "[email protected]"], 
    ["name": "name2", "email": "[email protected]"] 
] 

var users = [User]() 
for dictionary in dictionaryOfUsers { 
    let user = User() 
    user.setValuesForKeys(dictionary) 
    users.append(user) 
} 
+0

我想將字典作爲單個對象傳遞給方法而不是傳遞鍵值pair func setValuesForKeys(_ keyedValues:[String:Any]) –

+0

@AshimDahal我相信這就是你所追求的。 '[String:Any]'類型只是'Dictionary '的語法糖。如果這仍然不起作用,請改進您的問題,顯示更多代碼,以便我們可以進一步幫助您。 –

+0

@AshimDahal剛剛想到我還有另外一個(優雅!)的解決方案,使用Swift 4,結構體,並且沒有keypaths;)如果我有時間,今天晚些時候會嘗試發佈它... –

1

的問題是,你要使用可可鍵 - 值編碼 - 這就是setValuesForKeys(_:)來自 - 在結構 。你不能那樣做。可可是Objective-C; Objective-C不知道Cocoa結構是什麼。您需要User爲從NSObject派生的@objc類,並且其所有屬性也需要公開爲@objc

或者,使用新的Swift 4 keypaths功能,該功能可以通過其鍵訪問struct屬性。例如:

struct User { 
    var name: String? 
    var email: String? 
} 

let arrayOfDicts = [ 
    [\User.name: "name1", \User.email : "[email protected]"], 
    [\User.name : "name2", \User.email : "[email protected]"] 
] 

for d in arrayOfDicts { 
    var user = User() 
    for key in d.keys { 
     user[keyPath:key] = d[key]! 
    } 
    print(user) 
} 
/* 
User(name: Optional("name1"), email: Optional("[email protected]")) 
User(name: Optional("name2"), email: Optional("[email protected]")) 
*/ 
+0

這給了我錯誤「類型沒有下標成員」 – fullMoon

+0

@fullMoon然後你沒有做我說的。將我的答案中的代碼複製並粘貼到Swift 4項目中並運行它。有用。 (例如,一個典型的錯誤是你拼錯'keyPath',但這不是_my_錯誤,我拼寫正確。) – matt