Swift 基本语法1

跟風遠走 提交于 2019-12-22 14:07:13

一、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,不再使用<>。不需要导入自定义类。
语句结尾的分号可有可无

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!