2017-10-07 98 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