草庐IT

arrays - Swift:具有多个键的关联数组:值

coder 2023-09-05 原文

我不是 Swift 专家,几个月来我一直在使用它来构建 Mac 应用程序。我想在内存中表示一个类似于 PHP 关联数组 但在 Swift 中的数据结构。假设我有一个数据表要加载到内存中,其中包含以下字段/记录:

ID Surname Name
1  XXX     YYY
2  ZZZ     WWW
3  JJJ     KKK

我想要获得的是一个关联数组,就像我能够在 PHP 中获得的那样:

$arr[1]["Surname"] = "XXX"
$arr[1]["Name"] = "YYY"
$arr[2]["Surname"] = "ZZZ"
$arr[2]["Name"] = "WWW"

我只是无法在 Swift 中找到正确的数据结构来获得相同的结果。我尝试使用以下代码:

class resObject: NSObject {
    private var cvs = [Int: [String: String]]()

    override init() {

        self.cvs[0] = ["Name" : "XXX"]
        self.cvs[0] = ["Surname" : "YYY"]
        self.cvs[1] = ["Name" : "ZZZ"]
        self.cvs[1] = ["Surname" : "WWW"]

        for (key, arr) in cvs {
            let sur = arr["Surname"]
            let nam = arr["Name"]

            println("Row \(key) - Surname: \(sur), Name: \(nam)")
        }

        super.init()
    }
}

在我看来它非常接近,但它不起作用。我在输出中得到的是以下内容(我不关心“可选”:

Row 0 - Surname: Optional("XXX"), Name: nil
Row 1 - Surname: Optional("ZZZ"), Name: nil

我尝试在调试中进行一些测试,我注意到保存在内存中的数据只是最后使用的键值对的数据(即,如果我首先分配姓氏,然后分配姓名,我得到的姓氏为 nil 和名称具有正确的值)。

请考虑一下,如示例所示,我在声明变量时不知道数据结构,因此我将其声明为空并稍后以编程方式填充它。

我不知道是我没有正确声明数据结构,还是 Swift 不允许这样做。任何帮助将不胜感激。

非常感谢。 问候, 阿莱西奥

最佳答案

一种方式是结构字典。考虑:

struct Person {
    var firstName: String
    var lastName: String
}

var peopleByID = [ Int: Person ]()
peopleByID[1] = Person(firstName: "First", lastName: "Last")
peopleByID[27] = Person(firstName: "Another", lastName: "LastName")

var myID = 1 // Try changing this to 2 later
if let p = peopleByID[myID] {
    println("Found: \(p.firstName) with ID: \(myID)")
}
else {
    println("No one found with ID: \(myID)")
}

然后您可以更新结构:

peopleByID[1].firstName = "XXX"
peopleByID[27].lastName = "ZZZ"

你可以自由迭代:

for p in peopleByID.keys {
    println("Key: \(p) value: \(peopleByID[p]!.firstName)")
}

请注意,仅仅是 [Person] 的数组并不是那么热门,因为 ID:

-- 可能不是 Int,但通常是 String

-- 即使它们仍然是 Int,数组占用的存储空间与编号最高的索引成比例,而 Dictionary 占用的存储空间仅与存储对象的数量成比例。想象一下只存储两个 ID:523123 和 2467411。

编辑

您似乎提前知道将进入每个Person 对象的属性。这很奇怪,但你应该这样做:

struct Person {
    var attributes = [String : String]() // A dictionary of String keys and String values
}
var peopleByID = [ Int : Person ]()

// and then:

var p1 = Person()
var p2 = Person()
p1.attributes["Surname"] = "Somename"
p1.attributes["Name"] = "Firstname"
p2.attributes["Address"] = "123 Main St."
peopleByID[1] = p1
peopleByID[2] = p2

if let person1 = peopleByID[1] {
    println(person1.attributes["Surname"]!)

    for attrKey in person1.attributes.keys {
        println("Key: \(attrKey) value: \(person1.attributes[attrKey]!)")
    }
}

关于arrays - Swift:具有多个键的关联数组:值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736079/

有关arrays - Swift:具有多个键的关联数组:值的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  8. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  9. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐