常量和变量
常量的值设置了就无法改变,变量值将来设置也会发生改变
我们可以用一个参赛报名的需求来了解常量和变量,参赛人员是常量是不变的,报名人数是一个变量,随着报名人数增加而增加之至于参赛名额一致
常量及变量的声明
/// 常量-参赛人员上限
let participateMax = 10;
/// 变量-已报名人数
var Signup = 0;
复制代码
如果代码中的存储值不变,请始终使用let关键字将其声明为常量。 仅将变量用于存储需要更改的值。
修改变量值
报名人数递增,之至等于参赛名额,输出,人员已经满了
while signup < participateMax {
signup += 1
}
print("参赛名额\(participateMax)已报名人数\(signup)") // 参赛名额10已报名人数10
复制代码
类型安全性和类型推断
swift是一门类型安全的语言,如果我们清楚知道自己使用的类型是String还是Int,就不能错误的将Int传递给String,swift也会在运行的时候检测类型不匹配及时标记成错误,可以让我们在开发阶段就避免许多问题。当让这些事你提前声明了属性的类型,若没有声明属性,编译器会检查你值的类型,自动将其转成对应类型。
let meaningOfLife = 42
// 这种情况你并没有声明类型,但是通过字面值42,swift会判断你想声明的类型位Int
let pi = 3.14159
//同样你没瘦声明这个浮点型字面量声明属性,swift会推断属性类型为Double
let anotherPi = 3 + 0.14159
// 表达式会更具这个结果来判断你所想使用的类型位Double
复制代码
anotherPi本身没有显式类型,因此从浮点字面量作为加法的一部分可以推断出Double的适当输出类型。
Tuples元组
元组,是OC中没有的数据类型,元组主要将多个值组成一个组合值,元组中值可以是任何类型。
// 我们常用的错误码将错误码和描述,一个Int类型一个String类型写成一个元组。描述成类型元组
let errorInfo = (404,"不存在")
// 我们也可以将两个常量或者变量组成一个元组
let (errorCode,errorDic) = errorInfo
print("errorCode\(errorCode),errorDic\(errorDic)") // errorCode404,errorDic不存在
// 若你只需要一个变量,另一个用_表示
let (justErrorCode,_) = errorInfo
print("\(justErrorCode)") // 404
// 我们也可以使用0开始下标获取元素值
print("errorInfo.0 = \(errorInfo.0),errorInfo.1 = \(errorInfo.1)") // errorInfo.0 = 404,errorInfo.1 = 不存在
// 定义元组时候可以命名每个元素
let errorInfo = (errorCode:404,errorDic:"不存在");
// 可以使用个元素命命取对应的值
print("errorCode\(errorInfo.errorCode),errorDic\(errorInfo.errorDic)") // errorCode404,errorDic不存在
复制代码
元组适用于简单相关值。如果比较复杂建议使用类或者结构体
Optionals可选
当值可能不存在的时候我们使用可选绑定,Swift 的可选项让你可以表明任何类型都没有值,而无需特殊的常量。
let constantName = Int("332f2")
/// 可选绑定Int 使用Int初始化的时候,字符串可能包含Int,可选类型为Inr,也可以不是Int
if (constantName != nil) {
print("是数字\(String(describing: constantName))")
}else{
print("不是数字\(String(describing: constantName))")
}
复制代码
我们在调用这个Int初始化方法的时候可能会报错,他返回的是一个可选的Int,他不是一个具体的Int,要么返回一个Int类型的要么什么也没有。
nil
可以设置可选变量值为nil,如果代码中的常量或变量在某些条件下需要在没有值的情况下工作,请始终将其声明为适当类型的可选值。
var delegate:UITableViewDelegate? = nil
复制代码
如果定义了一个可选变量而不提供默认值,则该变量会自动设置为 nil:
var nameStr:String?
// 此时nameStr == nil
if nameStr == nil {
print("nameStr == nil") // nameStr == nil
}
复制代码
if 语句和强制解包
我们如何判断一个可选变量或常量包含值,只需要使用if语句将可选值与nil做比较 == nil 没有包含可选值 !=nil 则包含可选值
var nameStr:String?
if nameStr != nil {
print("nameStr 包含string")
}
复制代码
如果我们确定可选变量包含某个值,我们可以使用!来强制解包
var nameStr:String? = "name"
if nameStr != nil {
print("nameStr ==\(nameStr!)") // nameStr ==name
}
复制代码
Optional Binding可选绑定
我们可以使用可选绑定来确定一个可选项是否包含一个值,如果包含,则将该值作为临时常量或变量可用。 可选绑定可以与 if 和 while 语句一起使用,以检查可选中的值,并将该值提取到常量或变量中,作为单个操作的一部分
var nameStr:String? = "name"
if let name = nameStr {
print("nameStr == \(name)") // nameStr == name
}
复制代码
Implicitly Unwrapped Optionals
隐式展开可选项,我们在声明的时候用!不用?,如果隐式解包的可选项为 nil 并且您尝试访问其包装的值,则会触发运行时错误。结果与在不包含值的普通可选项之后放置一个感叹号完全相同。我们可以使用隐式展开解包。
var nameStr:String! = "name"
//nameStr = nil
//print("nameStr ==\(nameStr!)") 会报错
if nameStr != nil {
print("nameStr ==\(nameStr!)") // nameStr ==name
}
复制代码
我们也可以使用可选绑定来解包获取值
if let name = nameStr {
print("nameStr == \(name)") // nameStr == name
}
复制代码
当变量有可能在以后变为 nil 时,不要使用隐式解包的可选项。 如果您需要在变量的生命周期内检查 nil 值,请始终使用普通的可选类型。
异常处理
可以使用异常处理来响应程序在执行期间可能遇到的异常报错。当函数遇到错误条件时,它会抛出错误。 然后该函数的调用者可以捕获错误并做出适当的响应。
我们可以自定义一个异常
enum myError:Error {
/// 下标不合法
case indexError
/// 数组越界
case indexOut
}
复制代码
自定义一个函数,在发生错误的时候抛出异常
func canThrowAnError(array:NSArray, index:Int) throws {
// this function may or may not throw an error
if index < 0 {
throw myError.indexError
}
if index >= array.count {
throw myError.indexOut
}
print(" array下标index元素为-\(array[index])")
}
复制代码
我们会通过catch来做对应的异常处理
/// printf 请输入合法的下标
do {
try canThrowAnError(array: ["1"], index: -1)
// no error was thrown
} catch myError.indexError{
// an error was thrown
print("请输入合法的下标")
} catch myError.indexOut {
print("数组下标越界")
}
/// printf 数组下标越界
do {
try canThrowAnError(array: ["1"], index: 1)
// no error was thrown
} catch myError.indexError{
// an error was thrown
print("请输入合法的下标")
} catch myError.indexOut {
print("数组下标越界")
}
复制代码
断言与先决条件
断言的用处主要是在运行时,检查程序的有效性。若布尔条件计算为true,则程序继续执行,若为flase,则程序无效不执行。断言可帮助您在开发过程中发现错误和不正确的假设。
下面让我们看看如何使用断言:
let age = -5
assert(age > 0, "年纪不合法")
复制代码
如果使用了条件判断可以使用assertionFailure来指失断言失败。
let age = -5
if age>0 {
print("年纪合法")
} else {
assertionFailure("年纪合法")
}
复制代码
先决条件是当一个条件可能为false(假),但是继续执行代码要求条件必须为true(真)的时候,需要使用先决条件。例如使用先决条件来检查是否下标越界,或者来检查是否将一个正确的参数传给函数。
precondition(index > 0, "index必须大于0")
复制代码
断言帮助你在开发阶段找到错误和不正确的假设,先决条件帮助你在生产环境中探测到存在的问题。
断言和先决条件的不同点是,他们什么时候进行状态检测:断言仅在调试环境运行,而先决条件则在调试环境和生产环境中运行。在生产环境中,断言的条件将不会进行评估。
























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)
![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
