varstr ="Hello, playground"
//================Day41.元组=============
//1.1元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
//声明一个元组
lethttpError = (404,"NotFound")
httpError.0
httpError.1
//1.2你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:
let(statusCode,statusMessage) =httpError
println("\(statusCode)")
println("\(statusMessage)")
//1.3如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
let(justStatusCode,_) =httpError
println("\(justStatusCode)")
//1.4你可以在定义元组的时候给单个元素命名:
lethttp200Status = (statusCode:200,description:"OK")
http200Status.statusCode
http200Status.0
http200Status.description
http200Status.1
//备注:作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个(Int, String)元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。请参考函数参数与返回值。
//=======================2.可选类型=============
//2.1使用可选类型(optionals)来处理值可能缺失的情况,Swift的可选类型可以让你暗示任意类型的值缺失,并不需要一个特殊值。
//下面的例子使用toInt方法来尝试将一个String转换成Int
letpossibleNumber ="123"
letconvertedNumber =possibleNumber.toInt()
//convertedNumber被推测为类型"Int?",或者类型"optional Int"
//因为toInt方法可能会失败,所以它返回一个可选类型(optional)Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选类型,也就是说可能包含Int值也可能不包含值。
//====================3.if语句以及强制解析===============
//3.1当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping):
lettestNumber:Int?
ifconvertedNumber!=nil{//一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:
println("\(possibleNumber) has an integer value of\(convertedNumber!)")
}
//====================4.可选绑定========================
//使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量
letsomeOptional:String? ="123"
ifletconstantName =someOptional{
println(constantName)
}
//=====nil====
//你可以给可选变量赋值为nil来表示它没有值:
varserverResponseCode:Int? =404
// serverResponseCode包含一个可选的Int值404
serverResponseCode=nil
// serverResponseCode现在不包含值
//注意:
//nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
varnumber:Int? =nil
number
//================4.隐式解析可选类型=============
//可选类型暗示了常量或者变量可以“没有值”。可选可以通过if语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。
//有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
//
//这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。
//
//当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在Swift中类的构造过程中
//一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。
letpossibleString:String? ="An optional string."
println(possibleString!)//需要惊叹号来获取值
//输出"An optional string."
letassumedString:String! ="An implicitly unwrapped optional string."
println(assumedString)//不需要感叹号
//输出"An implicitly unwrapped optional string."
//注意:
//如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。
//===============5.断言=============
//怎么觉得像java里面的抛异常、、、
//可选类型可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况。然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能没办法继续执行。这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因。
//
//使用断言进行调试
//
//断言会在运行时判断一个逻辑条件是否为true。从字面意思来说,断言“断言”一个条件是否为真。你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果条件判断为true,代码运行会继续进行;如果条件判断为false,代码运行停止,你的应用被终止。
//
//如果你的代码在调试环境下触发了一个断言,比如你在Xcode中构建并运行一个应用,你可以清楚地看到不合法的状态发生在哪里并检查断言被触发时你的应用的状态。此外,断言允许你附加一条调试信息。
//
//你可以使用全局assert函数来写一个断言。向assert函数传入一个结果为true或者false的表达式以及一条信息,当表达式为false的时候这条信息会被显示:
letage = -3
assert(age>=0,"A person's age cannot be less than zero")
//因为age < 0,所以断言会触发
//在这个例子中,只有age >= 0为true的时候,即age的值非负的时候,代码运行才会继续。如果age的值是负数,就像代码中那样,age >= 0为false,断言被触发,结束应用。
//
//断言信息如果不需要,可以被省略,就像这样:
assert(age>=0)
//何时使用断言
//
//当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
//
//整数类型的下标索引被传入一个自定义下标脚本实现,但是下标索引值可能太小或者太大。
//需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
//一个可选值现在是nil,但是后面的代码运行需要一个非nil值。