当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称
- 变量 var 修饰 例如:var a:Int=10//声明一个为Int类型的变量a并赋值为10
- 获取 var b:String="hello 树哥"//声明一个为String类型的变量b并赋值为" hello 树哥 "
swift 可以自动类型推断 ,当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。
- var a=10//自动推断为Int类型
- var b="hello 树哥"//自动推断为String 类型
- var varB = 3.14159// varB 会被推测为 Double 类型
Swift 是一个类型安全(type safe)的语言。
由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误
- var a=10
- a="hello 树哥"//提示错误:error: cannot assign value of type 'String' to type 'Int'
意思为不能将 'String' 字符串赋值给 'Int' 变量
Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。类似与kotlin dart语言 可空类型,例如:
var myString:String? = nil
说明myString的值可以赋值为nil 如 myString=nil,也可以赋值正常String 值 ,如 myString ="hello 树哥"
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示这个值一定不为空 这个和dart语言类似 跟kotlin的!!类似,比如:
- var myString:String? = "hello 树哥"
- print(myString) //打印输出: Optional("hello 树哥")
加上!
- var myString:String? = "hello 树哥"
- print(myString!) //打印输出:hello 树哥
在声明可选变量时使用感叹号(!)替换问号(?)。这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。
- var myString:String!
- myString = "hello 树哥"
- print(myString)//打印输出:hello 树哥
当然如果变量在声明时就已经赋初始值的情况就可以直接使用了,例如:
- var myString:String = "hello 树哥"
- print(myString)//打印输出:hello 树哥
使用 if let临时常量 = 可选类型 来判断可选类型是否包含值,如果包含就把值赋给临时常量,否则(可选类型为nil时)if语句判断为假。
- var optionalName: String? = "树哥"
- var greeting = "树哥!"
- if let name = optionalName {
- greeting = "Hello, \(name)"
- }
- print(greeting)
如果optionalName的值不为空,则把optionalName的值赋值给name ,然后运行 {
greeting = "Hello, \(name)"
}的语句,比如以上例子 最后打印下greeting值,因为 greeting = "树哥!"已赋值不为空,所以最后打印 Hello,树哥!
如果optionalName的值是nil 条件会判断为false 大括号里面的代码会跳过;
类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias 关键字来定义。语法格式如下:
typealias newname = type
例如以下定义了 Int 的类型别名为 Feet:
typealias Feet = Int
现在,我们可以通过别名来定义变量:
- typealias Feet = Int
- var distance: Feet = 100
- print(distance)
你可以通过使用字符串字面量或 String 类的实例来创建一个字符串:
- // 使用字符串字面量
- var stringA = "Hello, World!"
- print( stringA )
-
-
- // String 实例化
- var stringB = String("Hello, World!")
- print( stringB )
-
-
- // 使用字符串字面量创建空字符串
- var stringA = ""
let char1: Character = "A" //只能单个字符 多个会报错
例如:
- // Swift 中以下赋值会报错
- let char: Character = "AB"
//空字符变量
Swift 中不能创建空的 Character(字符) 类型变量或常量:
常量一旦设定,在程序运行时就无法改变其值。
常量可以是任何的数据类型如:整型常量,浮点型常量,字符常量或字符串常量。同样也有枚举类型的常量:
常量类似于变量,区别在于常量的值一旦设定就不能改变,而变量的值可以随意更改。
- let a= 42
- a=20//报错 ,常量不可修改值
- print(a)
其他都和变量一样,比如类型推荐、类型标注、类型别名等
像算术运算符(swift取消了++和--)、比较运算符、逻辑运算符和大多数编程语言一样,区间运算符 ... 这个比较独特类似kotlin的
Swift 提供了两个区间的运算符。
| 运算符 | 描述 | 实例 |
| 闭区间运算符 | 闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间,b必须大于等于a。 闭区间运算符在迭代一个区间的所有值时是非常有用的,如在for-in循环中: | 1...5 区间值为 1, 2, 3, 4 和 5 |
| 半开区间运算符 | 半开区间(a..<b)定义一个从a到b但不包括b的区间。 之所以称为半开区间,是因为该区间包含第一个值而不包括最后的值。 | 1..< 5 区间值为 1, 2, 3, 和 4
|
比如
- //闭区间运算符:
- for index in 1...5 {
- print(index)
- }
- //打印 1,2,3,4,5
-
-
- //半开区间运算
- for index in 1..<5 {
- print(index)
- }//打印 1,2,3,4
3.1 Swift 空格
Swift语言并不是像C/C++,Java那样完全忽视空格,Swift对空格的使用有一定的要求
运算符不能直接跟在变量或常量的后面。例如下面的代码会报错:
- let a= 1 + 2 //a后面直接加上等号(=)
- let a = 1+ 2//1后面直接添加 加号(+)
- let a =1+ 2
- let a=1+2
- let a=1+ 2
- let a =1+2//=后面直接跟上数值
只有这样写才不会报错:
- let a = 1 + 2; // 编码规范推荐使用这种写法
- let b = 3+4 // 这样也是OK的
if语句和其他编程语言一样 忽略
switch语句有点区别
Swift switch 语句中,默认语法是必须要添加 default 语句。但也可以不加
注意:在大多数语言中,switch 语句块中,case 要紧跟 break,否则 case 之后的语句会顺序运行,而在 Swift 语言中,默认是不会执行下去的,switch 也会终止(switch 不会从上一个 case 分支落入到下一个 case 分支中。只要第一个匹配到的 case 分支完成了它需要执行的语句,整个switch代码块完成了它的执行)。如果你想在 Swift 中让 case 之后的语句会按顺序继续运行,则需要使用 fallthrough 语句。
Swift Switch 语句中, break 是可以省略不写的(添加了也可以),默认执行完当前 case 下的内容后,直接返回了,即使后续还有可满足的条件。
- var a=2
- switch(a){
- case 1:
- print("hello 树哥")
- case 2:
- print("hello 王哥")
- case 2:
- print("hello 宝哥")
- case 4:
- print("hello 强哥")
- default:
- print("hello 绿哥")
-
- }
- //打印hello 王哥
Swift fallthrough 语句让 case 之后的语句会按顺序继续运行,且不论条件是否满足都会执行。
- var a=2
- switch(a){
- case 1:
- print("hello 树哥")
- case 2:
- print("hello 王哥")
- fallthrough
- case 3://这里改为3了
- print("hello 宝哥")
- case 4:
- print("hello 强哥")
- default:
- print("hello 绿哥")
-
- }
- //hello 王哥
- //hello 宝哥
Swift 数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。
Swift 数组会强制检测元素的类型,如果类型不同则会报错,Swift 数组应该遵循像Array<Element>这样的形式,其中Element是这个数组中唯一允许存在的数据类型。
如果创建一个数组,并赋值给一个变量,则创建的集合就是可以修改的。这意味着在创建数组后,可以通过添加、删除、修改的方式改变数组里的项目。如果将一个数组赋值给常量,数组就不可更改,并且数组的大小和内容都不可以修改。
以下是创建一个初始化大小数组的语法:
var someArray = [SomeType](repeating: InitialValue, count: NumbeOfElements)
以下实例创建了一个类型为 Int ,数量为 3,初始值为 0 的空数组:
var someInts = [Int](repeating: 0, count: 3)
以下实例创建了含有三个元素的数组:
- var someInts:[Int] = [10, 20, 30]
- var someStrings:[String]=["hello","啊","树哥"]
我们可以根据数组的索引来访问数组的元素,语法如下:
var someVar = someArray[index]
index 索引从 0 开始,即索引 0 对应第一个元素,索引 1 对应第二个元素,以此类推。
- var a:[Int] = [1,2,3,5]
- print(a[0])//打印:1
var a:[String]=["hello","啊","树哥"]
for 循环
- for i in a{
- print(i)
- }
forEach循环
- a.forEach {
- i in print(i)
- }
enumerate() 方法遍历(需要每个数据项的值和索引值)
- var a:[]=["hello","啊","树哥"]
- for (index, item) in a.enumerated() {
- print("在 index = \(index) 位置上的值为 \(item)")
- }
- 打印:
- 在 index = 0 位置上的值为 hello
- 在 index = 1 位置上的值为 啊
- 在 index = 2 位置上的值为 树哥
使用 append() 方法或者赋值运算符 += 在数组末尾添加元素
- var a:[String]=["hello","啊","树哥"]
- a.append("宝哥")
- //或者 a+=["宝哥"]
- print(a)
- //打印: ["hello", "啊", "树哥", "宝哥"]
- 也可以通过索引修改数组元素的值:
-
- var a:[String]=["hello","啊","树哥"]
- a[1]="呀"//修改数组第二个元素的值
- print(a)
- //打印:["hello", "呀", "树哥"]
我们可以通过只读属性 isEmpty 来判断数组是否为空,返回布尔值:
- var a:[String]=["hello","啊","树哥"]
-
- print("a.isEmpty = \(a.isEmpty)") //输出 a.isEmpty = false
Swift 字典用来存储无序的相同类型数据的集合,Swift 字典会强制检测元素的类型,如果类型不同则会报错。
Swift 字典每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。
和数组中的数据项不同,字典中的数据项并没有具体顺序。我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样。
Swift 字典的key没有类型限制可以是整型或字符串,但必须是唯一的。
如果创建一个字典,并赋值给一个变量,则创建的字典就是可以修改的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。
var someDict = [KeyType: ValueType]()
以下是创建一个空字典,键的类型为 Int,值的类型为 String 的简单语法:
var someDict = [Int: String]()
创建一个非空字典,同样key为Int类型,value为String类型,例如 :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] ,
我们可以根据字典的索引来访问数组的元素,语法如下:
var someVar = someDict[key]
例如
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
- print(someDict[2]!)//打印:a (此处使用了强制解析!不然会打印Optional("a"))
我们可以使用 updateValue(forKey:) 增加或更新字典的内容。如果 key 不存在,则添加值,如果存在则修改 key 对应的值。updateValue(_:forKey:)方法返回Optional值。
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
- print(someDict[2])
-
- someDict.updateValue("呀",forKey:2)
-
- print(someDict[2])
- //打印:
- Optional("a")
- Optional("呀")
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
- print(someDict[2])
-
- someDict[2]="啊"
-
- print(someDict[2])
- //打印:
- Optional("a")
- Optional("啊")
我们可以使用 removeValueForKey() 方法来移除字典 key-value 对。如果 key 存在该方法返回移除的值,如果不存在返回 nil
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
- someDict.removeValue(forKey: 2)
-
- for x in someDict{
-
- print(x)
- }
- //打印:
- (3, "树哥")
- (1, "hello")
通过指定键的值为 nil 来移除 key-value(键-值)对
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
-
- someDict[2]=nil
-
-
- for x in someDict{
-
- print(x)
- }
- //打印:
- (3, "树哥")
- (1, "hello")
字典的遍历和数组一样 for循环、forEach或者enumerate()方法
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
-
- for (key,value) in someDict{
-
- print("key=\(key),value=\(value)")
- }
-
-
- for (key, value) in someDict.enumerated() {
- print("字典 key \(key) - 字典 (key, value) 对 \(value)")
- }
-
-
- someDict.forEach{
-
- (key,value) in print("key=\(key),value=\(value)")
- }
打印结果:
key=2,value=a key=3,value=树哥 key=1,value=hello 字典 key 0 - 字典 (key, value) 对 (2, "a") 字典 key 1 - 字典 (key, value) 对 (3, "树哥") 字典 key 2 - 字典 (key, value) 对 (1, "hello") key=2,value=a key=3,value=树哥 key=1,value=hello
使用只读的 count 属性来计算字典有多少个键值对:
- var someDict:[Int:String] = [1:"hello", 2:"a", 3:"树哥"]
-
- print(someDict.count)//打印:3
元组类型,用于在单个复合值中对多个值进行分组
元组中的值可以是任何类型,并且不需要是相同类型
方式1:最简单的元组,就是在圆括号中,用逗号分隔的一组值
- var aTuple = (10, "TottiLV")
- //也可以存放数组和字典
- //例如
- let arr = [1,2,3]
- let dic = ["key1":"value1","key2":"value2","key3":"value3"]
- let anyTuple = (arr, dic)
是一个具有两个值的元组,一个元素是整数类型,另一个元素是字符串类型(这是一个合法的数据)
方式2:可以在声明时命名元组的变量,也可以使用它们的名称来调用
let error404= (errorCode:404, description:"Not Found")
- let error404 = (errorCode:401, description:"Not Found")
- //取下标为1处的值
- print(error404.1)//打印:Not Found
- let error404 = (errorCode:401, description:"Not Found")
-
- print(error404.errorCode)//输出:401
- let error404 = (errorCode:401, description:"Not Found")
- var (x,y)=error404
- print(x)
- print(y)
- //打印:
- 401
- Not Found
元组优点:
1、元组可以同时存储多种类型元素,且元素类型固定,以保数据安全,除非你定义数据类型为Any。编译器会对赋值参数类型进行检查
2、元组的元素个数固定,不允许增加、删除,编译器会严格校验赋值参数个数
3、无需定义key,但是必要时可以为数据命名,方便数据访问
4、适合同时遍历多元数据
元组缺点:
1、不适合存储大量数据,因为元组不支持append、remove等方法
2、考虑到工程实际情况,后段使用的语言可能不支持元组,需要转换为其他格式
元组适合应用于组合少量的多元的数据,与数组、字典结合使用可以产生强大威力
Swift 定义函数使用关键字 func。
定义函数的时候,可以指定一个或多个输入参数和一个返回值类型。
每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值来调用这个函数。函数的参数传递的顺序必须与参数列表相同。
函数的实参传递的顺序必须与形参列表相同,-> 后定义函数的返回值类型。
语法
- func funcname(形参) -> returntype
- {
- Statement1
- Statement2
- ……
- Statement N
- return parameters
- }
- func fun1(){
- print("无参数、无返回值函数")
- }
- func fun2(name:String){
- print("有参数无返回值函数 \(name)")
- }
//调用 fun2(name:"hello")
- func fun3()->String{
- return "hello"
- }
- func fun4(name:String)->String{
- return "hello " + "\(name)"
- }
//调用
fun2(name:"hello")
swift 函数中 参数名可以带标签
一般情况下我们声明一个函数,如下
- func fun5(name:String){
- print("hello \(name)")
- }
调用:fun5(name:"树哥")
然后使用参数标签的话,可以这样写
- func fun6(xxx name:String){
- print("hello \(name)")
- }
调用: fun6(xxx :"树哥)
标签的作用就是提示 标签可以使用 _ 来代替,这样调用函数的时候,直接传值要传的值就行了,例如:
- func fun9(_ name:String){
- print("hello \(name)")
- }
- fun9("树哥")
函数中默认参数指的是赋了初始值的参数,在调用函数的时候 默认参数可传也可不传,类似kotlin和dart一样
- func fun10(msg:String,name:String="树哥"){
- print(msg+"\(name)")
- }
-
- fun10(msg:"hello")
- fun10(msg:"hello",name:"大树")
一般默认在函数中定义的参数都是常量参数,也就是这个参数你只可以查询使用,不能改变它的值。
如果想要声明一个变量参数,可以在参数定义前加 inout 关键字,这样就可以改变这个参数的值了。例如:
func getName(_ name: inout String).........
此时这个 name 值可以在函数中改变。
一般默认的参数传递都是传值调用的,而不是传引用。所以传入的参数在函数内改变,并不影响原来的那个参数。传入的只是这个参数的副本。
当传入的参数作为输入输出参数时,需要在参数名前加 & 符,表示这个值可以被函数修改。
- func swapValues(_ v1: inout Int, _ v2: inout Int) {
- let tmp = v1
- v1 = v2
- v2 = tmp
- }
- var num1 = 10
- var num2 = 20
- swapValues(&num1, &num2)
- print(num1)//打印输出:20
- print(num2)//打印输出:10
规则
1、函数名相同
2、参数个数不同 || 参数类型不同 || 参数标签不同
9、 闭包
10、结构体
11、类
12、拓展