Swift3 指导手册:基础篇
在 Swift 3 指导手册中,我们将聚焦如何帮助初学者从一个完完全全的新手到基本掌握 Swift 。这里会使用 Swift 3 来教学。我们编写这个指导的初衷是因为市面上的很多指导手册都已过时了,因此它就不适合仅仅以“ Swift3 有哪些新功能”来行文。我们找了几位有多门语言的编程经验的人士,来教你 Swift 语言的独特性以及如何用好它。 变量和常量任何 Swift 中的变量要么不变的,要么是可变的。这句话可不要和 举例来说: let name = "Jameson" 如果你想改变 let name = "Jameson" name = "Bob" error: cannot assign to value: 'name' is a 'let' constant name = "Bob" 要解决它,我们可以使用 var name = "Jameson" name = "Bob" 这次代码就不会报错了。 一般来说,你应该默认去使用 基础类型在 Swift 中,一个类型被声明的写法是通过声明一个变量,然后紧跟一个冒号,然后是类型名称。例如我们声明一个整型,在 Swift 中类型是 let age: Int = 5 相似的,你可以声明一个字符串类型: let name: String = "Jameson" Swift 支持类型推断,可以不写具体的类型信息。然后让编译器根据它的初始值来推断它是什么类型的。 let age = 5 let name = "Jameson" age 和 name 的类型仍然是 Int 和 String ,但是这次我们跳过了类型声明,因为很显然,5 是 Int 类型,而 "Jameson" 是一个字符串。 记住, let 关键字仅仅使值变得不可变。如果我们预测这个 age 的值是可变的,而 name 不是可变的,那么我们应该这么写: var age = 5 let name = "Jameson" 现在如果要更新 age 的值,可以这么做: var age = 5 let name = "Jameson" age = 25 print(age) 25 使用字符串用 let age = "15" let name = "Robb" let sentence = name + " is " + age print(sentence) Robb is 15 改用另外一个方式来拼接 let sentence = "(name) is (age)" print(sentence) Robb is 15 现在也可以看到同样的效果,但是它更容易阅读和组合。 也许你注意到了, 这样的话,以下代码会产生错误。 let age = 15 let name = "Robb" let sentence = name + " is " + age print(sentence) Error: Binary operator '+' cannot be applied to operands of type 'String' and 'Int' 因此我们所要做的就是将 let age = 15 let name = "Robb" let stringAge = String(age) let sentence = name + " is " + stringAge print(sentence) Robb is 15 我们创建了一个新的变量叫做 let age = 15 let name = "Robb" let sentence = name + " is " + String(age) print(sentence) print("(name) enjoys being (String(age))") Robb is 15 Robb enjoys being 15 可选类型Swift 中有可选类型的概念。一个可选类型是一个可以为 var favoriteColor: String? 在对可选类型的声明中如果不进行赋值,那么它就是 var favoriteColor: String? print(favoriteColor) nil 我们之后将对 var favoriteColor: String? favoriteColor = "Blue" print(favoriteColor) Optional("Blue") 我们发现结果不是 如果我们想知道里面是什么,需要马上拆开礼物,对可选类型来说也是一样,当传递和使用它们时,实际我们只是在和一个也许有值的容器在打交道。就像礼物一样,可选类型在被使用之前必须被解包。 Swift 中声明一个可选类型可以不赋值,编译也会通过。但是如果我们声明这些变量时不加上可选类型的符号,那么就会报错。 var favoriteColor = "Blue" favoriteColor = nil error: nil cannot be assigned to type 'String' 同样,非可选类型在声明的时候也不能被赋值为 var favoriteColor: String error: variables must have an initial value 解包我们现在知道可选类型是什么了,它们可以使变量可以为空,也知道与其说它们是值不如说是一个容器。因此,在项目中要访问可选类型中的内容时,我们该怎么做? 第一,最普遍的方式是使用可选类型绑定,在可选绑定中,你可以在一个 if 语句中把可选类型的值赋给一个新的值。如果可选类型包含一个值,那个新的变量就会被成功设置,并且跟随 var favoriteAnimal: String? var favoriteSong: String? favoriteAnimal = "Fox" 现在我们使用可选绑定来看一看编程变量是否都有值,我们可以打印出包含它们值的语句。首先先来检查一下 favoriteAnimal。 if let unwrappedFavoriteAnimal = favoriteAnimal { print("Favorite animal is: " + unwrappedFavoriteAnimal) } Favorite animal is: Fox 当没有被设置值时,仅仅会触发 if let unwrappedFavoriteSong = favoriteSong { print("Favorite song is: " + unwrappedFavoriteSong) } else { print("I don't know what your favorite song is!") } I don't know what your favorite song is! 如果我们要解包多个可选类型,并且对它们进行逻辑处理,首先要检查它们: var favoriteAnimal: String? var favoriteSong: String? favoriteAnimal = "Fox" favoriteSong = "Shake it Off" if let unwrappedFavoriteSong = favoriteSong { if let unwrappedFavoriteAnimal = favoriteAnimal { print(unwrappedFavoriteSong + " " + unwrappedFavoriteAnimal) } } 这看上去非常杂乱,因此 Swift 提供一种简便方式来一次解包多个变量: var favoriteAnimal: String? var favoriteSong: String? favoriteAnimal = "Fox" favoriteSong = "Shake it Off" if let unwrappedFavoriteSong = favoriteSong,let unwrappedFavoriteAnimal = favoriteAnimal { print(unwrappedFavoriteSong + " " + unwrappedFavoriteAnimal) } 集合类Swift 有好几种集合类型,最常用的是数组、集合、字典。 数组我们首先来看一下数组的例子。 let starks: [String] = ["Eddard","Catelyn","Robb","Sansa"] 这里我们定义了一个基本的 let starks = ["Robb","Sansa","Arya","Jon"] 我们可以有多种方式访问数组中的元素,比如通过 let starks = ["Robb","Jon"] print( starks[0] ) print( starks[2] ) print( starks.first! ) Robb Arya Robb 你应该发现数组是以 0 为下标开始的,因此数组中的第一个元素 if starks.count >= 4 { print( starks[3] ) } 有几种方式可以自动的检查这个类型,但是因为一些性能原因它不会默认去做。 哈希类型/字典字典可以存储键值对,键的典型类型是字符串类型,但它也可以是 Swift 中的其他各种类型。在下面这个例子中,我们会创建一个基本字典,以字符串为键,整型为值。 let ages = ["Robb": 15,"Sansa": 12,"Arya": 10,"Jon": 15] 我们可以访问这些值通过 print( ages["Arya"]! ) print( ages["Jon"]! ) 10 15 要注意的是,我们解包这些值只是因为它们是可选值,它们有可能为 使用可选绑定来解包字典中的值是较安全的,特别是你认为这些值很有可能为 if let aryasAge = ages["Arya"] { print("Arya is (aryasAge) years old") } Arya is 10 years old 我们也可以把数组存储在字典中,或者把字典存储在数组中,或者把他们混合使用。 let families = [ "Stark": ["Robb": 15,"Jon": 15],"Baratheon": ["Joffrey": 13,"Tommen": 8] ] let tommensAge = families["Baratheon"]!["Tommen"]! print("Tommen is (tommensAge) years old") Tommen is 8 years old 这个 houses 的类型将会是 集合Swift3 中的集合和数组很相似,但集合的值是唯一的和无序的。 初始化一个集合看起来就像初始化一个数组,唯一不同的是类型: let colors: Set<String> = ["Blue","Red","Orange","Blue"] 代码创建了一个字符串的集合。大于和小于符号 let colors: Set<String> = ["Blue","Blue"] print(colors) ["Orange","Blue"] 你也许还注意到了顺序也不一致了,因为集合不会维持特定的顺序。 我们无法像访问数组下标一样的方式去访问集合。但是可以用集合中内置的方法来增加或者删除元素,可以通过 var colors: Set<String> = ["Blue","Blue"] colors.insert("Black") colors.insert("Black") colors.remove("Red") print(colors) print(colors.contains("Black")) print(colors.contains("Red")) ["Black","Blue"] true false 构造集合对象最常见的方式就是罗列哪些元素应该纳入列表,哪些元素应该被排除。 这里还有许多方法我还没有提到,我建议你去阅读一下苹果的官方文档关于这三种集合类型,这样就会对它们更了解。 元组元组并不是一种集合,而应该说是用一个标识符来表示多个不同变量。 let fullName = ("Jameson","Quave")
let fullName = ("Jameson","Quave") print(fullName.1) print(fullName.0) Quave Jameson 元组也可以用一个新的多个变量名来构造: let (first,last) = ("Jameson","Quave") print(first) Jameson 由于我们没有用到 last name,可以忽略那个值通过使用下划线 _ ,并且仍然构造 first name。 let (first,_) = ("Jameson","Quave") print(first) Jameson 当你在使用方法时想返回多个返回值时,元组会很有用。 控制流Swift 的控制流比起其他语言要优雅,我们先从 if 10 > 5 { print("10 is greater than 5.") } else { print("10 is not greater than five.") } 10 is greater than 5 你也可以用括号来包裹 if (10 > 5) { ... Swift 也支持 let name = "Jameson" switch(name) { case "Joe": print("Name is Joe") case "Jameson": print("This is Jameson") default: print("I don't know of this person!") } This is Jameson 由于此处 name 的值是 print("This is Jameson") 如果我们把名称设置为一些之前没有出现在列举情况的东西时,比如 let name = "Jason" switch(name) { case "Joe": print("Name is Joe") case "Jameson": print("This is Jameson") default: print("I don't know of this person!") } I don't know of this person! 循环和集合类型Swift3 不再支持你过去所使用的 C 风格的循环,取而代之的是使用枚举和 let names = ["Robb","Jon"] for name in names { print("Name: (name)") } Name: Robb Name: Sansa Name: Arya Name: Jon 如果你想要循环整个数组,这个写法就很棒,没有 C 风格的数组,如果我们循环遍历一系列数字呢?Swift 中的 for i in 1...10 { if i % 3 == 0 { print(i) } } 3 6 9 另外一种方式是通过 let byThrees = stride(from: 3,to: 10,by: 3) for n in byThrees { print(n) } 3 6 9 从英语来看十分好读,你也可以说你从 3 数到 10 每隔3个数。这里我们创造 for n in stride(from: 3,by: 3) { print(n) } 3 6 9 集合都有一个 let names = ["Robb","Jon"] for nameIndex in names.indices { if(nameIndex < 3) { print(names[nameIndex]) } } Robb,Sansa,Arya 在集合中还有枚举的方法,它允许你通过遍历下标和值: let names = ["Robb","Jon"] for (index,name) in names.enumerated() { print("(index): (name)") } 0: Robb 1: Sansa 2: Arya 3: Jon 在 Swift3 中还有很多方式来遍历对象,但他们通常不是很常用。 也许你已经发现我们的循环中同时给两个变量赋值,index 和 name。它们被用逗号分隔并被括号括起来,表示我们从 本篇文章快速总结了一下 Swift 3 中手册中比较基础的部分,下一章,我将带领你们在真是项目中去演练我们所学到的知识,做到活学活用。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |