Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组和字典中存储的数据值类型必须明确.这意味着我们不能把不正确的数据类型插入其中.Swift对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚.也让我们在开发中可以早早的找到任何的类型不匹配错误.@H_301_2@
如果你用变量(var)创建的集合,这些集合就是可变的(增删改).如果用常理创建的,这些集合是不能被操作的.@H_301_2@
1. 数组(array)@H_301_2@
@H_301_2@@H_301_2@@H_301_2@参考:@H_301_2@@H_301_2@@H_301_2@@H_301_2@
Swift 集合类型(Collection Type) 之 数组(array)@H_301_2@
@H_301_2@
2. Set@H_301_2@
3. 字典(dictionary)@H_301_2@
@H_301_2@@H_301_2@
@H_301_2@
@H_301_2@
@H_301_2@
语法:@H_301_2@
完整写法是 Dictionary<Key,Value>,简短写法是[Key: Value].(尽管这两种写法一样,官方还是建议使用简写的方法)@H_301_2@
@H_301_2@
@H_301_2@
@H_301_2@
var@H_301_2@
someDict = [@H_301_2@
Int@H_301_2@
:@H_301_2@
String@H_301_2@
]()
@H_301_2@ 如果类型可以根据上下文推断出来@H_301_2@ ,@H_301_2@ 可以直接使用@H_301_2@ [:]@H_301_2@ 创建一个空的字典@H_301_2@
@H_301_2@ someDict[@H_301_2@ 5@H_301_2@ ] =@H_301_2@ "@H_301_2@ 我@H_301_2@ "@H_301_2@
someDict = [:]
@H_301_2@ 字典字面量创建@H_301_2@
@H_301_2@
someDict = [@H_301_2@ 5@H_301_2@ :@H_301_2@ "@H_301_2@ ,@H_301_2@ 2@H_301_2@ :@H_301_2@ 爱@H_301_2@ 1@H_301_2@ :@H_301_2@ 你@H_301_2@ "@H_301_2@ ]
@H_301_2@ println@H_301_2@ (@H_301_2@ "@H_301_2@ \@H_301_2@ (@H_301_2@ someDict@H_301_2@ )"@H_301_2@ )
@H_301_2@ 如果@H_301_2@ dictionary@H_301_2@ 的@H_301_2@ key@H_301_2@ 和@H_301_2@ value@H_301_2@ 的数据类型都一样@H_301_2@ 那么可以简写成@H_301_2@
@H_301_2@ @H_301_2@ var@H_301_2@ dict = [@H_301_2@ "m"@H_301_2@ ,27)">"i"@H_301_2@ ,216)">3@H_301_2@ :@H_301_2@ 4@H_301_2@ :@H_301_2@ "s"@H_301_2@ ]
@H_301_2@ 数量@H_301_2@
@H_301_2@ @H_301_2@ println@H_301_2@ (@H_301_2@ (@H_301_2@ dict.@H_301_2@ count@H_301_2@ 是否为空@H_301_2@ isEmpty@H_301_2@ 下面写法@H_301_2@ 如果@H_301_2@ 存在就修改字典原来的值@H_301_2@ 如果不存在就添加新的元素@H_301_2@ .
@H_301_2@ dict[@H_301_2@ "U"@H_301_2@
@H_301_2@ 和上面方法一样@H_301_2@ 如果存在就修改旧的值@H_301_2@ 如果不存在就添加一个新值@H_301_2@ 和上面方法不一样的是@H_301_2@ 该方法会在你更新以后返回旧的值@H_301_2@ 这样你就可以判断是否更新成功@H_301_2@ .@H_301_2@ 该方法返回的是一个@H_301_2@ optional@H_301_2@ 值@H_301_2@ 因为如果不存在该@H_301_2@ 会返回@H_301_2@ nil
@H_301_2@ @H_301_2@ let@H_301_2@ oldValue:@H_301_2@ String@H_301_2@ ? = dict.@H_301_2@ updateValue@H_301_2@ (@H_301_2@ "u"@H_301_2@ ,forKey:@H_301_2@ 5@H_301_2@ )
@H_301_2@ (@H_301_2@ oldValue@H_301_2@ 可以通过将@H_301_2@ 的值设为@H_301_2@ nil@H_301_2@ 来删除一个值@H_301_2@
@H_301_2@ dict[@H_301_2@ 5@H_301_2@ ] =@H_301_2@ nil@H_301_2@
@H_301_2@ 这个方法返回删除掉的值@H_301_2@ 如果不存在返回@H_301_2@ nil.@H_301_2@ 所以返回值也是@H_301_2@ .
@H_301_2@ @H_301_2@ let@H_301_2@ removedValue = dict.@H_301_2@ removeValueForKey@H_301_2@ (@H_301_2@ (@H_301_2@ removedValue@H_301_2@ )"@H_301_2@ )
@H_301_2@ 遍历字典@H_301_2@
@H_301_2@ @H_301_2@ //@H_301_2@ 可以使用@H_301_2@ for-in@H_301_2@ 循环遍历字典@H_301_2@ 每个元素都以@H_301_2@ (key,value)@H_301_2@ 元组的形式返回@H_301_2@ 可以临时的将元组的组成拆解成变量或常量@H_301_2@ @H_378_404@ for@H_301_2@ (key,value)@H_301_2@ in@H_301_2@ dict {
@H_301_2@ (@H_301_2@ key@H_301_2@ ):@H_301_2@ \@H_301_2@ (@H_301_2@ value@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ 也可以只取出字典的@H_301_2@ 或者@H_301_2@ value
@H_301_2@ @H_301_2@ for@H_301_2@ key@H_301_2@ in@H_301_2@ dict.@H_301_2@ keys@H_301_2@ {
@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ for@H_301_2@ value@H_301_2@ in@H_301_2@ dict.@H_301_2@ values@H_301_2@ {
@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ 还可以将字典的全部@H_301_2@ 或者全部@H_301_2@ 取出来@H_301_2@ @H_378_404@ let@H_301_2@ dictKeys = dict.@H_301_2@ keys@H_301_2@
@H_301_2@ let@H_301_2@ dictValues = dict.@H_301_2@ values@H_301_2@
@H_301_2@ 因为字典是无序的@H_301_2@ 但可以使用全局函数@H_301_2@ sorted@H_301_2@ 对其@H_301_2@ 排序@H_301_2@ @H_378_404@ for@H_301_2@ sortedVaule@H_301_2@ in@H_301_2@ sorted@H_301_2@ (dict.@H_301_2@ values@H_301_2@ ) {
@H_301_2@ (@H_301_2@ sortedVaule@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ (@H_301_2@ dict@H_301_2@ )"@H_301_2@ ) @H_301_2@
@H_301_2@ 如果类型可以根据上下文推断出来@H_301_2@ ,@H_301_2@ 可以直接使用@H_301_2@ [:]@H_301_2@ 创建一个空的字典@H_301_2@
@H_301_2@ someDict[@H_301_2@ 5@H_301_2@ ] =@H_301_2@ "@H_301_2@ 我@H_301_2@ "@H_301_2@
someDict = [:]
@H_301_2@ 字典字面量创建@H_301_2@
@H_301_2@
someDict = [@H_301_2@ 5@H_301_2@ :@H_301_2@ "@H_301_2@ ,@H_301_2@ 2@H_301_2@ :@H_301_2@ 爱@H_301_2@ 1@H_301_2@ :@H_301_2@ 你@H_301_2@ "@H_301_2@ ]
@H_301_2@ println@H_301_2@ (@H_301_2@ "@H_301_2@ \@H_301_2@ (@H_301_2@ someDict@H_301_2@ )"@H_301_2@ )
@H_301_2@ 如果@H_301_2@ dictionary@H_301_2@ 的@H_301_2@ key@H_301_2@ 和@H_301_2@ value@H_301_2@ 的数据类型都一样@H_301_2@ 那么可以简写成@H_301_2@
@H_301_2@ @H_301_2@ var@H_301_2@ dict = [@H_301_2@ "m"@H_301_2@ ,27)">"i"@H_301_2@ ,216)">3@H_301_2@ :@H_301_2@ 4@H_301_2@ :@H_301_2@ "s"@H_301_2@ ]
@H_301_2@ 数量@H_301_2@
@H_301_2@ @H_301_2@ println@H_301_2@ (@H_301_2@ (@H_301_2@ dict.@H_301_2@ count@H_301_2@ 是否为空@H_301_2@ isEmpty@H_301_2@ 下面写法@H_301_2@ 如果@H_301_2@ 存在就修改字典原来的值@H_301_2@ 如果不存在就添加新的元素@H_301_2@ .
@H_301_2@ dict[@H_301_2@ "U"@H_301_2@
@H_301_2@ 和上面方法一样@H_301_2@ 如果存在就修改旧的值@H_301_2@ 如果不存在就添加一个新值@H_301_2@ 和上面方法不一样的是@H_301_2@ 该方法会在你更新以后返回旧的值@H_301_2@ 这样你就可以判断是否更新成功@H_301_2@ .@H_301_2@ 该方法返回的是一个@H_301_2@ optional@H_301_2@ 值@H_301_2@ 因为如果不存在该@H_301_2@ 会返回@H_301_2@ nil
@H_301_2@ @H_301_2@ let@H_301_2@ oldValue:@H_301_2@ String@H_301_2@ ? = dict.@H_301_2@ updateValue@H_301_2@ (@H_301_2@ "u"@H_301_2@ ,forKey:@H_301_2@ 5@H_301_2@ )
@H_301_2@ (@H_301_2@ oldValue@H_301_2@ 可以通过将@H_301_2@ 的值设为@H_301_2@ nil@H_301_2@ 来删除一个值@H_301_2@
@H_301_2@ dict[@H_301_2@ 5@H_301_2@ ] =@H_301_2@ nil@H_301_2@
@H_301_2@ 这个方法返回删除掉的值@H_301_2@ 如果不存在返回@H_301_2@ nil.@H_301_2@ 所以返回值也是@H_301_2@ .
@H_301_2@ @H_301_2@ let@H_301_2@ removedValue = dict.@H_301_2@ removeValueForKey@H_301_2@ (@H_301_2@ (@H_301_2@ removedValue@H_301_2@ )"@H_301_2@ )
@H_301_2@ 遍历字典@H_301_2@
@H_301_2@ @H_301_2@ //@H_301_2@ 可以使用@H_301_2@ for-in@H_301_2@ 循环遍历字典@H_301_2@ 每个元素都以@H_301_2@ (key,value)@H_301_2@ 元组的形式返回@H_301_2@ 可以临时的将元组的组成拆解成变量或常量@H_301_2@ @H_378_404@ for@H_301_2@ (key,value)@H_301_2@ in@H_301_2@ dict {
@H_301_2@ (@H_301_2@ key@H_301_2@ ):@H_301_2@ \@H_301_2@ (@H_301_2@ value@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ 也可以只取出字典的@H_301_2@ 或者@H_301_2@ value
@H_301_2@ @H_301_2@ for@H_301_2@ key@H_301_2@ in@H_301_2@ dict.@H_301_2@ keys@H_301_2@ {
@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ for@H_301_2@ value@H_301_2@ in@H_301_2@ dict.@H_301_2@ values@H_301_2@ {
@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ 还可以将字典的全部@H_301_2@ 或者全部@H_301_2@ 取出来@H_301_2@ @H_378_404@ let@H_301_2@ dictKeys = dict.@H_301_2@ keys@H_301_2@
@H_301_2@ let@H_301_2@ dictValues = dict.@H_301_2@ values@H_301_2@
@H_301_2@ 因为字典是无序的@H_301_2@ 但可以使用全局函数@H_301_2@ sorted@H_301_2@ 对其@H_301_2@ 排序@H_301_2@ @H_378_404@ for@H_301_2@ sortedVaule@H_301_2@ in@H_301_2@ sorted@H_301_2@ (dict.@H_301_2@ values@H_301_2@ ) {
@H_301_2@ (@H_301_2@ sortedVaule@H_301_2@ )"@H_301_2@ )
}
@H_301_2@ (@H_301_2@ dict@H_301_2@ )"@H_301_2@ ) @H_301_2@