将结构添加到字典中,然后随机调用这些结构

时间:2014-08-31 00:12:21

标签: ios struct swift

我想在这里做两件不同的事情并且两者都有错误。我试图将struct添加到字典中,然后我编写了一个函数来随机抽取一个字典条目。

这是结构:

struct Customer
{
    var name: String
    var email: String
}

字典:

var customerDatabase: [String: String] = [Customer(name: "Lionel Messi", email: 
"lmessi@fifa.com"), Customer(name: "Cristiano Ronaldo", email: "cronaldo@fifa.com"), 
Customer(name: "Wayne Rooney", email: "wrooney@fifa.com")]

这是我收到的字典错误信息:

  

游乐场执行失败:: 45:42:错误:输入' [String:String]'不符合协议' ArrayLiteralConvertible'   var customerDatabase:[String:String] = [客户(姓名:" Lionel Messi",电子邮件:" lmessi@fifa.com"),客户(姓名:" Cristiano Ronaldo& #34;,电子邮件:" cronaldo@fifa.com"),客户(姓名:" Wayne Rooney",电子邮件:" wrooney@fifa.com")]

最后,我的函数将从我的字典中随机抽取Customer结构。

func randomCustomer() -> ()
{
    var customer = arc4random_uniform(customerDatabase)
    return customer
}

我的功能的错误消息。

<EXPR>:48:39: error: '[String : String]' is not convertible to 'UInt32'
    var customer = arc4random_uniform(customerDatabase)
                                  ^
Darwin._:1:5: note: in initialization of parameter '_'
let _: UInt32

我觉得这样一个菜鸟问这么简单的问题。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

以下是更正后的代码:

var customerDatabase:[Customer] = [Customer(name: "Lionel Messi", email:
    "lmessi@fifa.com"), Customer(name: "Cristiano Ronaldo", email: "cronaldo@fifa.com"),
    Customer(name: "Wayne Rooney", email: "wrooney@fifa.com")]

func randomCustomer() -> Customer
{
    let customer = Int(arc4random_uniform(UInt32(customerDatabase.count)))
    return customerDatabase[customer]
}

for _ in 1...10 {
    println(randomCustomer().name)
}

1)你真的需要一个数组而不是字典。在这种情况下,您需要一组Customer个对象或[Customer]

2)randomCustomer函数需要返回Customer。首先,调用arc4random_uniform(),其生成的数字介于0和1之间,而不是您传递的数字。在这个例子中,我们传递数组中Customer个对象的数量为3的计数,但首先我们必须将它变成UInt32,因为这是arc4random想要的。它生成一个随机的0,1或2,并将其作为UInt32返回,我们将其转回Int并分配给变量customer。然后将此customer值用作Customer数组的索引,以选择函数返回的值。

3)最后,我添加了一个循环来调用randomCustomer() 10次并打印出他们的名字。请注意,我使用_的循环索引而不是iindex等变量名称,因为我们不使用变量,所以我们不给它一个名。


这是一个字典版本:

var customerDatabase: [String:String] = ["Lionel Messi":
    "lmessi@fifa.com", "Cristiano Ronaldo": "cronaldo@fifa.com",
    "Wayne Rooney": "wrooney@fifa.com"]

func randomCustomer() -> Customer
{
    let keys = customerDatabase.keys.array
    let customer = Int(arc4random_uniform(UInt32(keys.count)))
    let name = keys[customer]
    let email = customerDatabase[name]!
    return Customer(name: name, email: email)
}

1)字典只使用用户名作为键,电子邮件作为值。

2)这次,随机函数首先创建字典中所有键的数组。然后它选择一个随机密钥,并使用该密钥获取电子邮件值。字典查找始终返回可选值。在这里,我们用!打开。最后,它从密钥(名称)和值(电子邮件)创建一个Customer对象并返回该对象。