Swift学习笔记- 1.基础部分

数值类型转换

浮点型:如果没有显式指定类型为 float,swift 会推断为 Double

整数转换

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne: UInt16 = twoThousand + UInt16(one)

转换格式:类型(变量)是调用 Swift 构造器并传入一个初始值的默认方法。UInt16 中有一个构造器,可以接受一个 UInt8 类型的值,所以这个构造器可以用现有的 UInt8 来创建一个新的 UInt16。注意,并不定传入任意类型的值,只能闯入 UInt16内部有对应构造器的值。不过可以扩展现有的类型来让它可以接受其他类型的值(包括自定义类型)。

整数和浮点数转换

整数和浮点数的转换必须显式指定类型:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine

反向转换同样可以,

let integerPi = Int(pi)

类型别名

类型别名就是给现有类型定义另一个名字。可以使用 typealias 关键字来定义类型别名

typealias AudioSampe = UInt16

var maxAmtlitudeFound = AudioSampe.min

布尔值

布尔类型 Bool, true 和 false

如果你在需要使用 Bool 类型的地方使用了非布尔值,swift 会报错

let i = 1
if i {
    //会报错
}

正确用法

let i = 1
if i == 1 {
    //合法
}

元组

元组(tuples)把多个值合成一个复合值。元组内的值可以使任意类型,并不要求相同类型

let http404Error = (404, "Not Found")

你可以把任意顺序的类型组合成一个元组,元组可以包含所有类型,你可以创建一个类型为(Int, Int, Int)或(String, Bool)或其他你想要的元组。

使用方式

(1)你可以将一个元组的内容分解成单独的常量和变量

let (statusCode, statusMessage) = http404Error

(2)如果你只想要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记

let (justTheStatsCode, _) = http404Error

(3)你还可以通过下标来访问元组中的单个元素,下标从0开始

println(http404Error.0)
println(http404Error.1)

(4)你可以在定义元组时给单个元素命名

let http200Status = (statusCode:200, description:"OK”)

(5)给元组中的元素命名后,可以通过名字来获取这些元素的值

println(http200Status.statusCode)
println(http200Status.description)

作为函数返回值时,元组非常有用

注意:

元组在临时组织值的时候很有用,但是并不适合穿件复杂的数据结构。如果并不是临时使用,请使用 类 或 结构体。

可选类型

使用可选类型(optionals)来处理值可能缺失的情况。

可选类型表示为: 有值,等于x 或 没有值

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

toInt方法返回一个可选类型的 Int,可选 Int 被写作 Int?而不是 Int

if 语句以及强制解析

你可以使用 if 语句来判断一个可选是否包含值。

当确定可选类型包含值之后,可以在可选的名字后面加一个感叹号(!)来获取值。这称为可选值的强制解析。

if (convertedNumber != nil) {
    println("\(possibleNumber) has an integer value fo \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

注意:

使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 !来强制解析值之前,一定要确定可选包包含一个非 nil 的值

可选绑定

使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在 if 或者 while 语句中来对可选类型的值进行判断并把值赋给一个常量或变量。

if let constantName = someOptional {
    statements
}

上面的例子可以写成:

if let actualNumber = possibleNumber.toInt() {
    println("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

可以在可选绑定中使用常量和变量。如果你像在 if 语句的第一个分支中操作 actualNumber 的值,可以改成 if var actualNumber,这样可选类型包含的值就会被赋给一个变量而非变量。

nil

你可以给可选变量赋值为 nil 来表示它没有值:

var serverResponseCode: Int? = 404
serverResponseCode = nil

注意:

nil 不能用于非可选的常量和变量。如果有常量或者变量需要处理值确实的情况, 请把它们声明成对应的可选类型。

如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil:

var surverAnswer: String?

swift 中的nil 和 OC的nil并不一样。在 OC 中,nil 一个指向不存在对象的指针。

在 swift 中,nil 不是指针,他是一个确定的值,用来表示值缺失。任何类型的都可以被设置为 nil,不只是对象类型。

隐式可选类型

可选类型暗示了常量或变量可以没有值。可选可以通过 if 语句来判断是否有值,如果有值的花可以通过可选绑定来解析值。

在有些时候,第一次被赋值之后,可以确定一个可选类型总会有值。这种情况下,每次判断和解析是非常低效的,因为它总是有值。

这种类型的可选状态被定义为 隐式解析可选类型,(type!)      例如:(String!)

当上述情况发生时,隐式解析可选类型非常有用。主要被用在 swift 类的构造过程中,(参考类实例之间的循环强引用)

一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型使用,并不需要每次都使用解析来获取可选值。

可选类型和隐式解析可选类型之间的区别:

let possibleString: String? = "An optional string"
println(possibleString!)

let assumedString: String! = "An implicity unwrapped optional string"
println(assumedString)

你可以把隐式解析可选类型当作一个可以自动解析的可选类型,你要做的只是把 !放到类型的结尾,而不是每次取值的可选名字的结尾。

注意:

如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和在没有值的普通可选类型后加 ! 是一样的

你仍然可以把隐式解析可选类型当做普通可选类型来判断它是否包含:

if (assumedString != nil) {
    println(assumedString)
}

你也可以在可选绑定中使用隐式可选类型来检查并解析它的值

if let definiteString = assumedString {
    println(definiteString)
}

注意:

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

断言

可选类型可以让你判断值是否存在,你可以在代码中处理值缺失的情况。然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行。这时,你可以在你的代码中触发一个断言(assertion)来结束代码云并通过调试找到值缺失的原因。

使用断言进行调试

断言会在运行时判断一个逻辑条件是否为 true。使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果为 true,继续运行,否则停止。

如果你的代码触发了一个断言,你可以清楚的看到不合法的状态发生在哪里并检查断言被出发时你的应用的状态。此外,断言允许你附加一条调试信息。

你可以使用全局 assert 函数写一个断言。向 assert 函数传入一个结果为 true 或 false 的表达式以及一条信息,当为 false 时会显示这条信息:

let age = -3
assert(age >= 0, "A person‘s age cannot be less than zero”)

当 age < 0时,断言被触发,结束应用

合适使用断言

当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。

断言的使用场景:

  • 整数的附属脚本索引被传入一个自定义附属脚本实现,但是下标索引值可能太小或者太大。
  • 需要给函数传入一个值,但是非法的值可能导致函数不能正常运行。
  • 一个可选值现在是 nil,但是后面的代码运行需要一个非 nil 值。

注意:断言可能导致你的应用终止运行,所以你应当仔细设计你的代码来让非法条件不会出现。然而,在你的应用发布之前,有时候非法条件可能出现,这时使用断言可以快速发现问题。

时间: 2024-08-26 22:51:48

Swift学习笔记- 1.基础部分的相关文章

Swift学习笔记(一):基础

一.常量 & 变量 //常量 let constantsTeam = 1 //变量 var variablesTeam = 2 尽可能使用常量,这样更清晰并且内存更不容易肾亏. 二.显示/隐式指定类型 //隐式 let inferredTeam = 3 //显式 let explicitTeam:Int = 4 三.字符串输出 //通过\(变量或常量名)来引用组合字符串 println("\(inferredTeam) is bigger than \(variablesTeam)!&q

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Swift学习笔记

Apple 新推的Swift已经好几天了.对于向我这样的oc都还没完全琢磨透彻的菜鸟来说--(简直就是福利啊,joke) 看了几天的Swift,只是有了基本的印象.总感觉比较换混乱,可能源自与自己没怎么学过脚本语言.索性,边看边记,加深印象. 本来部分内容源自Apple的<The Swift Programming Language>以及互联网教程.其余内容均为个人理解,不保证正确. 进入正题: 1.Swift是什么? Apple唤他作:雨燕.其实英语过了四级的都应该看出来,Swift还有一层

Swift学习笔记(11)--类与结构体

类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文件来使用类或者结构.Swift中的类或者结构可以在单文件中直接定义,一旦定义完成后,就能够被直接其它代码使用. 注意:一个类的实例一般被视作一个对象,但是在Swift中,类与结构更像是一个函数方法,在后续的章节中更多地是讲述类和结构的功能性. 1.类和结构的异同 类和结构有一些相似的地方,它们都可以

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类