学习或创建一个数据结构注重对增、删、改、查的学习
创建一个数组:
增:
.append(添加内容): 依次为数组添加元素
数组名 += [添加内容]: 即使只添加一个元素也需要[],因为参与运算的元素要是一致数据类型的
.insert(添加的内容, atIndex: 索引):遇到索引就要注意索引越界问题
删:
.removeLast():删除数组最后一个元素
.removeFirst():删除数组的第一个元素
.removeAtIndex(索引值):删除特定(索引值对应)的数组元素
.removeRange(索引范围):删除特定范围(索引范围对应的)的数组元素
.removeAll():删除所有元素,该数组为空数组
改:
数组名[索引值] = [修改内容]:修改对应索引的内容
数组名[索引范围] = [对应索引范围的修改内容]:修改对应索引范围的内容,注意索引范围的索引个数和修改内容数组的元素个数并不一致。
2. 数组的基本用法
数组名.count: 数组元素个数
数组名.isEmpty: 判断数组是否为空,返回是布尔类型
通过索引值(数组下标)获取元素(数组从0开始索引,索引值为0的是第一个数组元素):
数组名[索引值]
注意:用数字索引会发生索引越界问题,需要开发者控制。
数组名.first / .last: 取数组的第一个 / 最后一个元素, 返回的是可选型(有的数组不一定存在第一个或者最后一个元素)
可选类型应用:空数组名.first 返回的是 nil
在实际使用.first的时候可以解包使用如:if let 变量名 = 数组名.first{ 使用到该数组第一个元素的语句 }(这样使用可在遇到空数组或者没有第一个元素的时候不会崩溃)
let定义为常量时,数组不会变化(用户修改不了),可确定数组是否为空来确定是否可以强制解包,这里安全性是由开发人员来保障。
逻辑判断最后一个元素:数组名[数组名.count - 1]
数组名.minElement() / .maxElement(): 返回可选型
获取一定范围的子数组:
数组名[范围(eg:1..<4)]
数组名.contains():验证返回这个数组是否存在某个元素,返回布尔类型
数组名.indexOf():验证这个数组是否存在某个元素,但返回的是索引值
for循环遍历数组获取数组元素、数组元素索引值(.enumerate())
for 变量名 in 数组名 {对获取的数组元素进行操作}
for (索引变量名, 元素变量名) in 数组名.enumerate() {使用到索引值和元素的语句}
数组名1 == 数组名2 :其他语言比较的是引用(也是地址吧),此语句不成立,swift比较的是值,故此语句成立。
强调:数组是一个有序的数据集合(在比较的时候要特别注意)
二、容器类:数组(array)、 字典(dictionary)、 集合(set)
1.数组 array
声明初始化数组:[ , ]
数组中各元素的元素类型必须是一致的
显式声明初始化:变量名: [数据类型] = [元素1, 元素2,...]
变量名: Array<数据类型> = [元素1, 元素2, ...]
声明初始化空数组:变量名 = Array<数据类型>()
非显式声明空数组:变量名 = [数据类型]()
当在实际应用中,出现数组中的参数很多且初始值为0或者为某一相同值时,可以用如下方式声明初始化数组:
变量名 = [数据类型](count: 5, repetedValue: 0)
变量名 = Array<数据类型>(count: 5, repetedValue: 0)
注意:
字符串数据类型和字符数据类型。" "默认为字符串数据类型,字符数据类型可定义数据类型为Character(字符类型数组需用对应的数据类型显式声明初始化)
在swift中Array和NSArray虽然都是数组,但不是同一种东西。
元组: 函数的返回值有多个需要考虑返回元组
func finmaxAndMin( numbers:[int]) -> (max: Int, min: Int){
return (30,0)
}
//隐式可选型 可为nil,可有值
var numbers: [Int] = [1,2,3,4,5]
var oneToFive = [1,3,4,2,5]
var vowels : [String] = ["A","E","I","O","U"]
vowels.count
vowels.isEmpty
vowels[1]
vowels.first
vowels.last
vowels.min()
vowels.max()
vowels.index(of: "E")
numbers.index(of: 3)
numbers[2..<4]
for (index,value) in vowels.enumerated(){
print(value)
print(index)
}
//swift数组是否相等 是判断值是否相等,有序的数据集合
oneToFive == numbers
//隐式可选型 可为nil,可有值
class City{
var cityName: String
unowned var country: Country
init(cityName: String, country: Country) {
self.cityName = cityName
self.country = country
}
}
class Country {
let countryName: String
var capitalCity: City?
init(countryName: String, capitalCity:String) {
self.countryName = countryName
self.capitalCity = City(cityName: capitalCity, country: self)
}
func showInfo(){
print("this is \(countryName)")
print("the capital is \(String(describing: capitalCity?.cityName))")
}
}
let china = Country(countryName: "China", capitalCity: "beiJing")
china.showInfo()
var ageInput: String = "16"
var age = Int(ageInput)//类型转换涉及到可选型
if let age = age, age < 20{
print("you are teenager\n")
}
swit 的三目运算符
var errorMessage: String? = nil
let message1 = errorMessage ?? "no Error"
let message2 = errorMessage == nil ? "no error" : errorMessage
可选型:swift的设计师不认为 nil null应该是某种类型(int)的特殊值,nil就是一种类型
2.可选型必须依附其他类型
var errorCode: String? = "404"
var errorMessage: String? = "not found"
if let errorCode = errorCode{
"error code is " + errorCode
}
if let errorCode = errorCode, errorMessage = errorMessage, where errorCode == "404"{
//通过where添加限制条件
}
errorMessage?.uppercased()
"?" 尝试进行解包
errorMessage!.uppercased()
"!"强制进行解包
默认都是传值,传引用用inout关键字
errormessage?.upercasString
let message =er ?? "not found"
04-2 可变长参数
// 变长参数只能有一个
// 变长参数不一定放在最后
func mean( numbers: Double ... ) -> Double{
// 将变长参数当做一个数组看待
for number in numbers{