swift 6. 字典

标签:swift

这一节,继续上一讲的数组,继续学习集合里面的字典。字典故名思议,有索引,有值,所以才叫字典,也就是一个键值对的合集,它是无须的。所以,如何理解swift的字典呢,就是PHP中的索引数组。这样就好理解多了。

字典长啥样

在学习如何申明一个字典之前呢,我们看下字典长啥样?

["TYO": "Tokyo","dub": "dublin"]
["TYO": 45,"dub": 66]

看,字典就长这样,就是一个一个key:value的组成的数组,也就是一个键值对的组合。

申明一个字典

在知道字典长这样了之后,我们或许已经知道如何创建一个字典呢。先从最原始的来申明创建:

var userinfo: Dictionary<String,String> = ["name": "yangyi","gender": "male"]

这种申明比如原始:先定义它是什么类型的字典,我们用var来申明是一个变量型字典,后面是可以修改的。然后,紧接着就是这个字典的名字userinfo,后面加一冒号: 再加上字典的申明标识符Dictionary,这个是写死的就得这样写,它表示是一个字典类型的数据,然后就是<type,type>键值对分别 是什么类型的,我们这里申明为键值对都是字符串型String。后面就是它的值了。是2个键值对的数组。

上面是申明字典并且附上值,那么如何创建空的字典呢。有下面4种方法:

// 创建空字典
var emptyDictionary1:[String:Int] = [:]
var emptyDictionary2:Dictionary<Int,String> = [:]
var emptyDictionary3 = [String:String]()
var emptyDictionary4 = Dictionary<Int,Int>()

记住,最后的括号()不能丢!

我们顺便来回顾一下,前面的几节当中,如何原始的申明一个变量,并且附上空值的:

//整型
var init1:Int = 3
//字符型
var string2:String = "iphone"
//布尔值
var bool1:Bool = false
//浮点型
var float1:Float = 1.234
//元祖
var tuples1:(Int,String,Int) = (1,"wer",12)
//访问tuples1.0,tuples1.1,tuples1.2
var tuples2 = (se:12,we:33)
//访问tuples2.se,tuples2.we

//数组
var array1:[String] = ["iphone","mac","ipad"]
var array2:[Int] = [1,2,3]
//申明空值数组
var array3 = [String]()
//申明有默认值的数组
var array4 = [String](count: 2,repeatedValue: "we")
var array5 = Array(count: 2,repeatedValue: "we")

访问和修改字典

上面讲了申明了一个字典,那怎么访问呢?其实,和访问数组的方式基本一样,只不过要用keyD1[key]

var userinfo2 = ["name":"yangyi","gender":"male"]
print(userinfo2["name"]) //输出的是可选类型的:Optional("yangyi")

//我们如何确认name存在,则可以用!来强制解包
print(userinfo2["name"]!) //输出:yangyi

//所以结合前面的可选型的用法,来解包:
if let name = userinfo2["name"]{
    print("nams is" + name) //输出:name is yangyi
}
var userinfo3 = [0:"yangyi",1:"male"]
print(userinfo3[1]) //输出:male

print(userinfo2.name) //报错了,你看搞混了吧。元祖才可以这样写!!

所以,同样,我们也是用 d1["name"] = "value" 这种方式来给字典赋值:

var d2 = Dictionary<Int,String>() //空的
d2[1] = "qw"
d2[4] = "rt"
print(d2) //输出: [4: rt,1: qw]

var d3 = ["name":"yangyi","gender":"male"]
d3["name"] = "liming" // 讲name改成了liming
d3["height"] = "190" // 新加一个key height,值为190
//d3["name"] = 33 // 报报错,不能将一个string转换成int型
print(d3) // [name: liming,gender: male,height: 190]

swift中呢,还有一个专门来跟新字典的方法函数叫updateValue("value",forKey:key),它是有返回值的,如果有这个key,修改成功后,返回的是原来的老值。如果没这个key,则返回空,swift中空为:nil,但是这个key 被加进去字典里了。

var d3 = ["name":"yangyi","gender":"male"]
var oldname = d3.updateValue("wangming",forKey: "name")
//讲name这个key替换成wangming
print(oldname) //原来的值为:Optional("liming")
print(d3) // [name: wangming,height: 190]

下面是nil的情况:

var d3 = ["name":"yangyi","gender":"male"]
var oldage = d3.updateValue("12",forKey: "age")
//讲age这个key替换成12。但是,却是不存在这个age这key的,所以值是nil
print(oldage) //nil
print(d3) // age加进去了 ["gender": "male","age": "12","name": "yangyi"]

字典删除或置空

我们赋值一个字典后,如果想要把这个字典重新赋值为空,可以直接这样:d1 = [:]; 这样就把d1字典给置空了:

var d1 = ["name":"yangyi","gender":"mail"]

println(d1) // [name: yangyi,gender: mail]

d1 = [:] //置空

print(d1) // []

有时候,我们并不想把所有的字典里面的元素给置空或删除,只是想把其中的某一个key给干掉,用d1["name"] = nil 这样就可以了

var d1 = ["name":"yangyi","gender":"mail"]
d1["name"] = nil //把key name给干掉了
print(d1) // 输出为:[gender: mail]

有这种常见的方式移除,那么肯定有一个函数方法来移除某一个key了,swift一般是按照常理出牌的,它就是removeValueForKey(key) 同样,存在这个key则返回它的值,不存在则是返回nil

var oldgender = d1.removeValueForKey("gender")
print(oldgender) //可选值:Optional("mail")
print(d1) / 被移除了:[name: yangyi]

removeAll函数,顾名思义,就是移除所有的内容。

var d1 = ["name":"yangyi","gender":"mail"]
d1.removeAll()

字典常用的方法和函数

count 求字典的数据数量:

var dict = ["name":"xiaoming"]

// 字典数据数量
dict.count // 1

isEmpty 判断字典是否为空,是返回true,不为空则返回false

// 判断字典是否为空
var dict = ["name":"xiaoming"]
dict.isEmpty // false

var emptyDictionary1:[String:Int] = [:]
emptyDictionary1.isEmpty //true

字典的遍历

我们来是这样手动的方式来访问字典的确不太好,既然是一个数据,那么是肯定是可以用for来遍历的,可以使用for-in循环来遍历某个字典中的键值对。每一个字典中的数据项都由(key,value)元组形式返回:

var d9 = ["name":"yangyi","gender":"mail"]
//用元祖的形式来遍历字典
for (key,value) in d9 {
    print("键为\(key),值为\(value)")
}
//键为name,值为yangyi
//键为gender,值为mail

我们也可以通过访问字典的keys或者values属性(都是可遍历集合)检索一个字典的键或者值。

var d9 = ["name":"yangyi","gender":"mail"]

for key in d9.keys {
    print("键为\(key)")
}
//键为name
//键为gender

for value in d9.values {
    print("值为\(value)")
}
//值为yangyi
//值为mail

print(d9.values) 
// LazyMapCollection<Dictionary<String,String>,String>

上面我们打印了d9.values 得到的是一个字典集合,我们可以直接把它变成数组,因为理论上它就是一个数组的形式: Array(d9.values)

var d9 = ["name":"yangyi","gender":"mail"]

var keyinfo = Array(d9.keys)
var valueinfo = Array(d9.values)

print(keyinfo) // [name,gender]
print(valueinfo) // [yangyi,mail]

字典的比较

由于字典是无须的,而且,swift中对于2个类型的值的比较,是比较值的,而不是引用。所以2个字典,只要值一样,顺序不同,也是一样:

let dict1 = [1:"A",2:"B",3:"C"]
let dict2 = [1:"A",3:"C",2:"B"]
dict1 == dict2 //true

OK,字典基本的内容就讲完了。

swift 6. 字典的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  6. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  7. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  8. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  9. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  10. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部