Swift基础部类

Swift基础类型
1、使用 let 来声明常量,使用 var 来声明变量。
注:你可以在一行中声明多个常量或者多个变量,用逗号隔开。

2、类型标注
如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。
let variable: String 
注意:一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型。

3、输出函数println 和 print
println:是一个用来输出的全局函数,输出的内容会在最后换行。
print:唯一区别是在输出内容最后不会换行。

4、把值转换成字符串
有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。
let apples = 3 
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit." 


5、注释
单行注释://
多行注释:/*  */

6、浮点数
Double:表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
Float:表示32位浮点数。精度要求不高的话可以使用此类型。

7、类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用 typealias 关键字来定义类型别名。
例如:当你想要给现有类型起一个更有意义的名字时,类型别名非常有用。假设你正在处理特定长度的外部资源的数据:
typealias AudioSample = UInt16
var minFound = AudioSample.min
var maxFound = AudioSample.max


8、创建元组 tuples
元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
例如:let http404Error = (404, "Not Found")

9、元组内容的分解
可以将一个元组分解成单独的常量和变量使用。
let (statusCode, statusStr) = http404Error

如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记。
let (justTheStatusCode, _) = http404Error

你还可以通过下标来访问元组中的单个元素,下标从零开始。
var code = http404Error.0
var msg = http404Error.1

10、可选值 optionals 的强制解析
一个可选的 Int 被写作 Int?而不是 Int,它表示这个整形变量可能有值,或者可能为nil(沒值)。
你可以使用 if 语句来判断一个可选是否包含值。如果可选有值,结果是 true;如果没有值,结果是 false。

可选值的强制解析:当你知道可选确实包含值后,则可以在可选的名字后面加上一个感叹号(!)来获取值。

11、nil
这个表示没有值的意思。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil:
var surveyAnswer: String?

注意:nil 不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。

12、 隐式解析可选
有时候在程序架构中,第一次被赋值之后,可以确定一个可选总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
这时我们就可以使用隐式解析可选,只需要把后面的 ? 改成 ! 即可。

13、隐式可选和可选的取值区别
let possibleString: String? = "An optional string."
println(possibleString!) // 需要惊叹号来获取值

let assumedString: String! = "An implicitly unwrapped optional string."
println(assumedString) // 不需要感叹号

注意:如果一个变量之后可能变成 nil 的话请不要使用隐式解析可选。如果你需要在变量的 生命周期中判断是否是 nil 的话,请使用普通可选类型。

14、断言
有时候如果缺少某些条件,我们不想让代码继续执行下去,就可以使用断言(assertion)。
断言会判断一个逻辑条件是否为true,如果是true则执行下去;否则就中止运行。
使用assert函数来写断言,例如:
let age = -3
assert(age >= 0, "a person's age can not less than 0”)
因为age >= 0 为false, 则断言触发,中止运行。

15、何时使用断言
- 整数的附属脚本索引被传入一个自定义附属脚本实现,但是下标索引值可能太小或者太大。
- 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
- 一个可选值现在是nil,但是后面的代码运行需要一个非 nil 值。
注意:断言可能导致你的应用终止运行,所以你应当仔细设计你的代码来让非法条件不会出现。然而,在你的应用发布之前,有时候非法条件可能出现,这时使用断言可以快速发现问题。

16、创建数组和字典
使用方括号[ ]来创建数组和字典,并使用下标或者键(key)来访问元素。
var shoppingList = [" catfish", "water", " tulips", "blue paint"]

var occupations = [
     "Malcolm": "Captain",
     "Kaylee": "Mechanic",
]

17、创建空数组和字典
如果类型信息可以被推断出来,你可以用[]和[:]来创建空数组和空字典——就像你声明变量或者给函数传参数的时候一样。


18、负数求余
在对负数 -b 求余时, -b的符号会被忽略. 这意味着 a % b 和 a % -b的结果是相同的.

19、闭区间运算符
闭区间运算符 a...b 定义一个包含从 a 到 b (包括 a 和 b)的所有值的区间。

20、半闭区间运算符
半闭区间  a..<b 定义一个从  a 到  b 但不包括  b 的区间. 之所以称为半闭区间,  是因为该区间包含第一个值而不包括最后的值。
方便的使用于数组,例如:
let names = ["Anna", "Alex", "Brian", "Jack"] 
let count = names.count 
for i in 0..<count { 
    println("第 \(i + 1) 个人叫 \(names[i])") 

21、字符串字面量
代码中包含一段预定义的字符串值作为字符串字面量,它可以包含下面的特殊字符:
1.转义特殊字符 \0 (空字符)、\\(反斜线)、\t (水平制表符)、\n (换行符)、\r (回车符)、\" (双引号)、\' (单引号)。
2.单字节 Unicode 标量,写成 \xnn,其中  nn 为两位十六进制数。
3.双字节 Unicode 标量,写成 \unnnn,其中 nnnn 为四位十六进制数。
4.四字节 Unicode 标量,写成 \Unnnnnnnn,其中 nnnnnnnn 为八位十六进制数。

22、字符串空属性判断
var str = ""
str.isEmpty //true

23、 countElements 函数
通过调用全局 countElements 函数,并将字符串作为参数进行传递可以获取该字符串的字符数量。
var str = "andy is a good guy"
countElements (str)

24、字符串插值
插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中。
let multiplier = 3 
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"

25、字符串比较
Swift 提供了三种方式来比较字符串的值:字符串相等,前缀相等和后缀相等。
(1)字符串相等:即使用 == 来比较字符串
(2)前缀/后缀相等:通过调用字符串的 hasPrefix/hasSuffix 方法来检查字符串是否拥有特定前缀/后缀,它会返回一个Boolean值。

26、字符串大小写
您可以通过字符串的  uppercaseString 和 lowercaseString  属性来访问一个字符串的大写/小写版本。

27、数组的类型标注
Swift 数组应该遵循像Array<SomeType>这样的形式,其中sometype是这个数组中唯一允许存在的数据类型。 我们也可以使用像SomeType[]这样的简单语法(推荐)。

如果我们创建了一个String 值类型的数组,我们不能往其中插入任何不是String 类型的数据。 Swift 中的数组是类型安全的,并且它们中包含的类型必须明确。
var shoppingList: String[] = ["Eggs", "Milk"]

因为Swift有类型推断, 所以当我们拥有相同类型的数组值时,我们可以写成:var shoppingList = ["Eggs", "Milk"]

28、创建空数组
创建特定数据类型的空数组,例如创建Int类型的空数组。
var someInts = Int[]() 

29、数组的属性和方法
(1)count属性:获得数组中数据的数量。
(2)isEmpty属性:检查数组是否存在值。
(3)append / += 方法:我们可以使用append方法或者 += 运算符在数组后面添加数据项。
例如:shoppingList.append("Flour") 或者 shoppingList += "Baking Powder" 或者 shoppingList += [ "Cheese", "Butter"]
(4)insert(atIndex:)方法:在某个具体索引值之前添加数据项。
例如:shoppingList.insert("Maple Syrup", atIndex: 0)
(5)removeAtIndex()方法:移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项。
例如:let mapleSyrup = shoppingList.removeAtIndex(0)
(6)removeLast()方法:移除数组中最后一项并返回其值。


30、利用下标改变一系列数据值
即使新数据和原有数据的数量是不一样的。
下面的例子把"Chocolate Spread","Cheese",和"Butter" 替换为"Bananas"和 "Apples":
shoppingList[4...6] = ["Bananas", "Apples"]

31、数组遍历
一般来说,for-in循环即可,但是如果我们需要每个数据项的值和索引,则需要使用全局 enumerate 函数来进行数组遍历,例如:
for (index, value) in enumerate(shoppingList) {
 ...
}

32、创建特定大小,数据默认的Array
// threeDoubles 是一种 Double[]数组, 等于 [0.0, 0.0, 0.0] 
var threeDoubles = Double[](count: 3, repeatedValue:0.0) 

因为我们Swift有类型推断的存在,所以在使用这种构造方法的时候不需要指明数据类型,因为从value中我们就知道了数据的类型:
var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)


33、字典
字典是一种存储相同类型多重数据的存储器。每个值(value)都关联独特的键(key),键作为字典中的这个值数据的标识符。
注:在某个特定字典中可以存储的键和值必须提前定义清楚,方法是通过显性类型标注或者类型推断。

Swift 的字典使用Dictionary<KeyType, ValueType>定义,其中KeyType是字典中键的数据类型,ValueType是字典中对应于这些键所存储值的数据类型。
例如:var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

和数组一样,如果我们使用字面语句构造字典就不用把类型定义清楚。airports的也可以用这种方法简短定义:
var airports = ["TYO": "Tokyo", "DUB": "Dublin"]


34、字典的方法和属性
基本和数组一样,都有类似的方法和属性,并且特别存在如下:
(1)updateValue(forKey:)方法:在这个键不存在对应值的时候设置值或者在存在时更新已存在的值,这个方法返回更新值之前的原值,这样方便我们检查更新是否成功。
(2)removeValueForKey(KeyName)方法:在键值对存在的情况下会移除该键值对并且返回被移除的value或者在没有值的情况下返回nil。

35、移除键值对
我们可以对某个键对应值赋予nil来移除这个键值对。
airports["APL"] = nil

36、字典遍历
使用for-in即可:
for (airportCode, airportName) in airports {
  ...
}

37、字典的keys 或 values 属性
这些属性代表一个字典的所有key 或 value 的集合。
for airportCode in airports.keys {
 ... 
}

for airportName in airports.values { 
     ....
 } 


38、将键 或 值构造成一个新数组
let airportCodes = Array(airports.keys) 
// airportCodes is ["TYO", "LHR"] 
 
let airportNames = Array(airports.values) 
// airportNames is ["Tokyo", "London Heathrow"]


39、创建一个空字典
var namesOfIntegers = Dictionary<Int, String>()

注:如果上下文中存在了空字典的字面语句,例如:namesOfIntegers[16] = "sixteen" ,则我们可以使用 namesOfIntegers = [:]  来定义一个Int, String类型的空字典。