一、Swift简介
2010年的夏天,苹果公司的开发人员Chris Lattne接到了一个特别的任务,为OS X 和iOS平台开发下一代的编程语言,也就是Swift。
苹果公司于2014年WWDC(苹果开发者大会)发布的新开发语言Swift,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
2015年的WWDC开发者大会上,苹果公司推出了Swift2.0版本,并且Swfit完全开源。
自从Swift发布以来,在http://www.tiobe.com中的排行一直处于上升的状态。
二、声明变量和常量
在Swift中使用“let”修饰一个常量,使用“var”修饰一个变量;
let修饰常量的值是不可以更改的;
var修饰的变量的值是可以更改的;
在声明常量和变量的时候可以使用表情符号、中文等命名常量名和变量名。
Swift里不会自动给常量变量赋初始值,也就是说常量变量不会有默认值,所以定义常量的时候一定要给定初始值
Swift定义变量或者常量的时候,需要标识出变量或者常量的类型,如果不标识,会根据初始值自动推断。
因为swift是强类型语言,所以不同类型的变量不能相加,如果想要相加,可以强制类型转换
1、声明常量变量
1 // MARK: - 定义常量变量:变量类型的隐式转换 2 3 // 在Swift中如果不给定变量常量的类型,该常量变量的类型就是其初始值的类型 4 var name = "Jack" // 隐式转换为String类型 5 6 var name1 : String = "Rose" // 给定name1的类型为String,不能赋值其他类型 7 8 var age : Int = 18 // 整型变量 9 10 var age1 : Int? // ?表示age1的类型为可选类型,其值可以为空 11 print(age1) 12 13 var gender : Character = "f" // 字符变量,字符用""括起来,""中只能写一个字符 14 15 var flag : Bool = true // Bool类型,其值只有true 和 false
2、定义字符串,以及常用到的函数
1. String是有序的字符集合,例如“Hello World”
2. Swift中的字符串通过String类型表示,当然也可以看成Character字符类型的集合
1 // MARK: - 字符串 2 // 1、创建一个空的字符串 3 var str_empty = "" 4 var str2_empty = String() 5 6 // 2、判断字符串是否为空 7 if str_empty.isEmpty { 8 print("空") 9 } else { 10 print("非空") 11 } 12 13 // 3、字符串的拼接 14 var url : String = "http://" 15 var str : String = "www.baidu.com" 16 // 方式1: 17 //url.appendContentsOf(str) 18 // 方式2: 19 var newUrl = url + str 20 // 方式3:字符串插值 -- \(变量名) 21 var newURL = "百度网址:\(newUrl)" 22 23 print(newURL) 24 25 // 4、获取字符串长度 26 var str1 : String = "abcdef" 27 print(str1.characters.count) 28 29 // 5、字符串的比较 30 var str2 : String = "MBBoy" 31 var str3 : String = "GBLW" 32 if str2 == str3 { 33 print("\(str2)和\(str3)相等") 34 } else if str2 > str3 { 35 print("\(str2)大于\(str3)") 36 } else { 37 print("\(str3)大于\(str2)") 38 }
3、Float 和 Double
1 // MARK: - float与double 2 var num1 = 3.14 // 不指定类型,默认是double类型 3 // 如果想定义float类型的变量,必须要指定类型 4 var num2 : Float = 2.14 5 // 因为swift是强类型语言,所以不同类型的变量不能相加,如果想要相加,可以强制类型转换 6 //var sum = num1 + num2 // 报错 7 var sum = num1 + Double(num2) // 不会报错 8 print("和是\(sum)")
4、小结
- 常量或者变量的类型必须和你赋给它们的值的类型一样;
- 声明时类型是可选的,声明的同时赋值的话,编译器会自动推断类型;
- 如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割;
- 使用let来声明常量,使用var来声明变量;
- 常量只能赋值一次,使用的时候可以直接获取到这个值;
- 数据只能进行显示类型转换;
三、声明一个数组、字典
在Swift中使用“let”或者“var”声明一个数组或者字典;
数组必须指定数据类型,如果没有指定类型则会根据数组的初值去推断数据类型;
字典所有的key值必须是同一数据类型;
字典所有的value必须是同一数据类型。
1、数组
1 // MARK: - 数组 2 // Swift中数组的元素类型必须相同,如果想存放不同类型的元素,用OC 3 4 // 定义一个数组 5 var nameArray = ["yuanyuan", "GBLW", "WYW"] 6 print(nameArray) 7 8 // 指定数组元素类型 9 var ageArray : Array<Int> = [1, 4, 5] 10 print(ageArray) 11 12 // 定义一个空数组 13 // 方式1: 14 var carArray = Array<String>() 15 // 方式2: 16 var carArray1 = [Int]() 17 print(carArray) 18 19 // 访问数组元素 20 print(nameArray[1]) 21 22 // 给数组添加元素 23 carArray.append("bb") 24 print(carArray) 25 26 // 使用运算符添加数组元素,可以添加多个 27 carArray += ["cc", "dd"] 28 print(carArray) 29 30 // 插入元素到具体位置 31 carArray.insert("aa", atIndex: 0) 32 print(carArray) 33 34 // 移除某个元素 35 carArray.removeAtIndex(2) 36 print(carArray) 37 38 // 移除所有元素 39 carArray.removeAll() 40 print(carArray) 41 42 // 数组排序 43 print(nameArray) 44 nameArray.sortInPlace() 45 print(nameArray)
2、字典
1 // MARK: - 字典 2 // 定义一个字典类型的变量 3 var dic : Dictionary<String,Int> = ["a" : 18, "b" : 33, "c" : 38] 4 print(dic) 5 6 // 定义空字典 7 // 方式1 8 var dic_empty = Dictionary<String, Int>() 9 // 方式2 10 var dic_empty2 : Dictionary<String, Int> = [:] 11 12 // 向字典中添加键值对 13 dic["d"] = 66 14 print(dic) 15 16 // 修改字典中的值 17 dic["d"] = 9 18 print(dic["d"]) 19 20 // 删除一个键值对 21 dic.removeValueForKey("a") 22 print(dic)
四、元组
元组是Swift里面独有的一种数据格式。
是一个可以返回多个值的数据格式。
在Swift里面声明的时候使用“()”声明。
元组可以通过下标去访问元素,也可以通过key值去访问元素;
整体的数据结构有点类似于C语言里面的结构体。
1 // MARK: - 元组 2 3 // 定义一个元组 4 // 方法1:直接初始化一个元组,使用Swift隐式转换 5 var tuples = ("水果",["香蕉", "苹果", "西瓜"]) 6 // 方法2:初始化元组的时候给元组指定类型 7 var tuples1 : (String, Array) = ("动物", ["🐶", "🐱", "🐯"]) 8 print(tuples1) 9 10 11 // 取值 12 // 方式1: 直接把元组赋给另外一个常量,根据相关标记进行取值, 13 let newTuples : (animals : String, pet : Array) = tuples1 14 print("\(newTuples.animals)里有\(newTuples.pet[0])、\(newTuples.pet[1])、\(newTuples.pet[2])") 15 16 // 也可以在定义元组的时候给单个元素命名 17 var tuples2 = (city : "北京", area : ["海淀区", "朝阳区"]) 18 // 取值时可以直接用名字来获取元素的值 19 print("\(tuples2.city)包括\(tuples2.area[0]),\(tuples2.area[1])") 20 21 // 常量名可以省略, 要忽略的元组元素可直接用_表示 22 let (_, fruit) = tuples 23 print(fruit) 24 25 // 方式2:直接根据下标取值 26 print("\(tuples.0)里有\(tuples.1[0]),\(tuples.1[1]),\(tuples.1[2])")
五、循环结构和分支结构
Swift里面的循环结构包含:for、for-in、while、repeat-while
Swift里面的分支结构包含:if、if-else
1、循环结构
1 var nameArray = ["yuanyuan", "GBLW", "WYW"] 2 var dic : Dictionary<String,Int> = ["a" : 18, "b" : 33, "c" : 38] 3 // MARK: - 循环结构 4 // 1、for 循环 5 // 第一种: 6 // i++后面不能直接接{ 会报错,要打一个空格或者换行 7 for var i = 1; i < 10; i++ { 8 print(i) 9 } 10 11 // 第二种: ..< 半闭集范围操作符 12 for number in 1..<10 { 13 print(number) // 不包括10 14 } 15 16 // 第三种: ... 闭集范围操作符 17 for number in 1...10 { 18 print(number) // 包括10 19 } 20 21 // 2、while 循环 22 var i = 8 23 while i > 0 { 24 print(i) 25 i-- 26 } 27 28 // repeat...while 相当于do...while,限制性一此循环体,再去判断条件语句,循环体至少走一次 29 repeat { 30 print("我爱你们") 31 }while 1 < 0 32 33 // 使用循环遍历数组 34 for newName in nameArray { 35 print(newName) 36 } 37 38 // 使用循环遍历字典 39 // 第一种: 40 for newAge in dic { 41 print(newAge) 42 } 43 // 第二种 44 for (key, value) in dic { 45 print("key = \(key), value = \(value)") 46 }
2、分支结构
switch分支结构:在Swift里面,switch的每个case后面会自动的添加一个break,所以不需要手动的去添加了。Swift里面的枚举是可以范围枚举的,系统会根据给定的数据自动的匹配相近的范围
1 // MARK: - 分支结构 2 // if 3 let flag1 = true 4 if flag1 == true { 5 print("是真哒!") 6 } else { 7 print("嘿嘿,假哒,骗你哒") 8 } 9 10 // switch 11 // 要求每个分支必须有代码 12 // switch形式使用fallthrough关键字,实现OC中没有break关键字的情况,每个case都执行 13 // 不写fallthrough,实现OC中有break关键字的情况 14 let value = 0 15 switch value { 16 case 0 : 17 print("0") 18 fallthrough 19 case 1 : 20 print("1") 21 // fallthrough 22 default : 23 print("other") 24 } 25 26 // case 后面可以使用一个范围 27 switch value { 28 case 0..<10 : 29 print("0 - 9") 30 case 10...20 : 31 print("10 - 20") 32 default : 33 print("额,不在范围内") 34 } 35 36 // case 后面可以使用常量或者变量 37 switch value { 38 case var i where value >= 0 && value <= 6 : i = 99 39 print(i) 40 default : 41 print("other") 42 } 43 44 // case 后面还可以使用元组 45 let point = (1, 10) 46 switch point { 47 case (10, 0) : 48 print("x = 10, y = 0") 49 case (2, 10) : 50 print("x = 2, y = 10") 51 case (_, 10) : 52 print("x = ?, y = 10") 53 default : 54 print("没") 55 }
六、枚举
C 语言中,枚举类型将枚举名和一个整型值相对应。
Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个确定的值。
如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数。
注意:只有枚举值是Int类型时才会有递增
1 // MARK: - 枚举(enum) 2 3 // 原始类型为int 4 enum Direction : Int { 5 case east = 0 6 case south = 1 7 case west = 2 8 case north = 3 9 } 10 // rawValue -- 枚举的原始值 11 print(Direction.east.rawValue) 12 13 // 原始类型为string 14 enum Seasen : String { 15 case spring = "春天" 16 case summer = "夏天" 17 case autumn = "秋天" 18 case winter = "冬天" 19 } 20 print(Seasen.spring.rawValue) 21 22 // 根据原始值获取相对应的枚举 23 print(Direction(rawValue: 2))
七、函数
Swift里面用 func 表示声明一个函数。
Swift的文件格式里面没有类似于OC的.h文件。所以,如果需要定义一个私有的函数,可以在func前面添加private 修饰。
- 函数类型:函数定义格式
- 无参无返回值
- 无参有返回值
- 有参无返回值
- 有参有返回值
- 有参多个返回值(返回一个元组)
func 函数名(参数名:参数类型,参数名:参数类型....)->返回值类型 {
函数实现
return 返回值
}
- 外部参数和内部参数
Swift中,一个参数有两个名字,内部参数名和外部参数名
内部参数名:在函数内部使用的参数名称。
外部参数名:在函数调用时候,显示的参数名称
- 忽略外部参数
默认情况下,函数的第一个参数,不显示外部参数名,其余参数,显示外部参数名,并且和内部参数名一致
如果不想要显示外部参数名,可以使用“_”忽略掉
注意:函数的第一个参数不能使用“_ ”忽略掉外部参数名。
- 函数嵌套
函数嵌套:Swift里面可以函数嵌套定义
注意:作用域问题,嵌套在函数1里的函数2不能在函数1外部调用,函数2是函数1私有的
- inout参数
inout参数:
1.参数默认是用let修饰,即常量
2.在参数前面添加var,就可以在函数内部修改参数的值,但不能改变实参变量的值.
3.如果参数使用inout来修饰,就成了输入输出参数,在函数内部修改参数,可以影响实参变量的值.此时实参必须是变量,且调用函数的时候传的参数是实参的地址
1 // MARK: - 函数 2 // 表示函数的关键字 func 3 // 函数的类型有五种: 4 // 1、无返回值无参数 ->Void 可省略 5 func function1() -> Void { 6 7 } 8 9 // 2、无返回值有参数 ->Void 可省略 10 func function2(str: String) -> Void { 11 print(str) 12 } 13 14 function2("baekhyun") 15 16 // 3、有返回值无参数 17 func function3() -> String { 18 return "boom sky" 19 } 20 21 print(function3()) 22 23 // 4、有返回值有参数 24 func function4(num1 : Int, num2 : Int) -> Int { 25 return num1 + num2 26 } 27 28 print(function4(1, num2: 2)) 29 30 // 5、有参,返回值为元组类型 31 func function5(a : Int, b : Int) -> (Int, Int, Int, Int) { 32 return (a - b, a + b, a * b, a / b) 33 } 34 35 print(function5(5, b: 6)) 36 37 // 外部参数和内部参数 38 // 内部参数名:在函数内部使用的参数名 39 // 外部参数名:在函数调用的时候,显示的参数名 40 func function6(first one : Int, second two : Int) { 41 print(one, two) 42 } 43 44 function6(first: 2, second: 5) 45 46 // 忽略外部参数 47 // 默认情况下,函数调用时,函数的第一个参数不显示外部参数名,其余参数显示外部参数名,并且和内部参数名一致,如果不想要显示外部参数名,可以使用 _ 忽略掉 48 // 注意:函数的第一个参数不能使用 _ 忽略掉外部参数名 49 func function7(one : Int, _ two : Int) { 50 print(one, two) 51 } 52 function7(3, 6) 53 54 // 函数嵌套 : Swift里函数可以嵌套定义 55 // 注意:作用域问题,嵌套在函数1里的函数2不能在函数1外部调用,函数2是函数1私有的 56 func function8() { 57 print("第一层") 58 func function9() { 59 print("第二层") 60 } 61 // 调用function9, 不调用的话function9不会执行 62 function9() 63 } 64 65 function8() 66 67 // inout参数 68 // 如果形参使用inout来修饰,就变成了输入输出参数,在函数内部改变形参的值,实参的值也会变 69 func function10 (inout name : String) { 70 name = "Baek" 71 print(name) 72 } 73 // 实参要定义为变量,不能定义成常量,否则不能传参给输入输出参数 74 var myName = "Hyun" 75 function10(&myName) // 传入的是个地址 76 print("myName : " + myName)
补充:
Swift中导入类库使用import,不再使用<>。不需要导入自定义类。
语句结尾的分号可有可无
来源:https://www.cnblogs.com/fearlessyyp/p/5512963.html