参考资料:
The Swift Programming Language 中文版
SwiftV课堂 (各种swift视频教程,绝大部分免费得,强烈推荐)
swiftist (swift论坛)
下面开始
常量与变量
swift中可以用let定义常量,var定义变量可以不指定常量或变量类型,这样就会有一个问题:let a = "hello" var b = “hello"
这是因为var a = 0 时swift自动给a设置为int型,后面都是以int型来计算和输出var a = 0 a += 3.14 println(a) //输出3
不过swift可以指定类型:var a:Float = 0 a += 3.14 println(a)//输出3.14
或者:var b = 0.0 b += 3.14 println(b)//输出3.14
注意:
一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型,如果没有赋初始值,最好指定类型
命名
还可以这样命名,好吧,实际项目中没人会这样做吧<span style="font-size:18px;">let π = 3.14159 let 你好 = "你好世界" let = “dog cow”</span>
你可以在一行中声明多个常量或者多个变量,用逗号隔开:print函数<span style="font-size:18px;">var x = 0.0, y = 0.0, z = 0.0</span>
字符拼接好方便:JAVA得这样var height = 175 var age = 24 println("身高是\(height),体重是\(age)")//输出 身高是175,体重是24
int height = 175; int age = 24; System.out.println("身高是"+height+",体重是"+age);//输出 身高是175,体重是24
注释
<span style="font-size:18px;">//这是一个注释 /*这是一个注释*/ /* //这是一个注释 /*这也是一个注释*/ */</span>
数值数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
运算时需转成同一类型
let twoThousand: UInt16 = 2_000 let one: UInt8 = 1 let twoThousandAndOne = twoThousand + UInt16(one)
整数和浮点数的转换必须显式指定类型:let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine // pi 等于 3.14159,所以被推测为 Double 类型
元组这是一个非常有趣的数据结构,想不出在JAVA中有什么相似的数据结构。
<span style="font-size:18px;">let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found")</span>
咋一看,有点像HashMap数据结构,但是元组并不是key,value来对应的,而且可以有多个数值:let a = (124,1725,"pkxutao")
并且只有一组,不像HashMap那样是一个数据集合。
你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:
<span style="font-size:18px;">let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found") let (statusCode, statusMessage) = http404Error println("The status code is \(statusCode)") // 输出 "The status code is 404" println("The status message is \(statusMessage)") // 输出 "The status message is Not Found"</span>
如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_
)标记:<span style="font-size:18px;">let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found") let (justTheStatusCode, _) = http404Error println("The status code is \(justTheStatusCode)")</span>
此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:<span style="font-size:18px;">let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found") println("The status code is \(http404Error.0)") // 输出 "The status code is 404" println("The status message is \(http404Error.1)") // 输出 "The status message is Not Found"</span>
你可以在定义元组的时候给单个元素命名,并可以通过名字来获取这些元素的值:作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个<span style="font-size:18px;">let http200Status = (statusCode: 200, description: "OK") println("The status code is \(http200Status.statusCode)") // 输出 "The status code is 200" println("The status message is \(http200Status.description)") // 输出 "The status message is OK"</span>
(Int, String)
元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。
可选类型
JAVA中没有这个概念,我的理解是一个可选类型要么有值,要么什么都没有,例如一个可选类型的int变量要么有个整数值,要么就什么都不是(并不是初始化为0)。
<span style="font-size:18px;">let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"</span>
因为toInt
方法可能会失败,所以它返回一个可选类型(optional)Int
,而不是一个Int
。一个可选的Int
被写作Int?
而不是Int
。问号暗示包含的值是可选类型,也就是说可能包含Int
值也可能不包含值。(不能包含其他任何值比如Bool
值或者String
值。只能是Int
或者什么都没有。)
强制解析( ! 的使用)
<span style="font-size:18px;">let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() println(convertedNumber+3)</span>
上面println那一行会提示错误,建议使用"!"或"?在convertedNumber后面插入"!"后编译通过,所以"!"的作用是:当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(
!
)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)。NIL
swift中得nil类似JAVA中的null,但是不同的是swift中除String类型的值能为nil外,其他类型的也可以,这样在有些方面就很方便了,先说说可选绑定。
使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在
if
和while
语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。<span style="font-size:18px;"></span><pre name="code" class="html">let possibleNumber = "123" if let actualNumber = possibleNumber.toInt() { println("\(possibleNumber) has an integer value of \(actualNumber)") } else { println("\(possibleNumber) could not be converted to an integer") } // 输出 "123 has an integer value of 123"
这段代码可以被理解为:
“如果
possibleNumber.toInt
返回的可选Int
包含一个值,创建一个叫做actualNumber
的新常量并将可选包含的值赋给它。”如果转换成功,
好了,下面继续说nil。在我们平常工作时,经常会遇到设置id的情况,假设这个变量id为int类型,在JAVA中我一般通过判断id是否为0来判断id是否被赋值(这种判断必须保证正常id不可能为0),有了nil,我们就可以通过判断id是否为nil来判断id是否被赋值了:actualNumber
常量可以在if
语句的第一个分支中使用。它已经被可选类型包含的值初始化过,所以不需要再使用!
后缀来获取它的值。在这个例子中,actualNumber
只被用来输出转换结果。
<span style="font-size:18px;"></span><pre name="code" class="html">var id: Int?
//id = 3
if let isNil = id{
println("id's value is \(id)")
}else{
println("id's value is nil")
}
<span style="font-size:18px;">
</span>
注意:nil
不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
隐式解析可选类型
就是在声明时在类型的后面加一个感叹号表示此值不会为nil
let assumedString: String! = "An implicitly unwrapped optional string."
断言
调试的时候用到,当满足前一个条件时后一个字符串会被输出并且程序结束
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0,所以断言会触发