这是我人生的第一个博客!!这篇博客主要是作为Swift 3.0初学者的我,为了完成老师布置的一些作业。
主要是解释Swift 3.0的三个概念:
1、optional、if let
2、面向协议
3、闭包
1、optional、if let:
首先,我们知道optional是Swift的一个特性,像我这种现阶段只学过C++和Java的人来说,optional的概念是很陌生的。所以,我想我还是从为什么要使用optional讲起吧。
为什么要使用optional?
- 空不是每个类型的可返回值,即当我们定义了一个函数的类型(比如string),那么我们就必须返回该类型(string),不然编译出错。而我们很多时候是存在一种无(空)的情况,比如string要返回空,它只能另外规定一个string值来充当空的作用。而当使用了optional(即string?)时,系统就允许返回空。
- 当一个函数不允许其传入的参数为空(nil)时,因为有optional的存在,所以不使用optional时类型为非空类型(比如Oject类型为非空类型,Object?为可为空类型),那么函数参数就不会有空了。
- 要用Bool类型去判断三种情况,因为Bool类型只有true和false,所以一般是不能判断三种情况的,但如果使用optional(Bool?),那么就可以有true、false、nil三种判断值。
接下来,讲一下optional是什么?
- optional中文意思为:可选择的,是一个形容词,所以说它是用来修饰名词的。那么它是修饰什么名词呢?那就是类型。optional类型,就是可为空的类型。
- 用代码的形式表示就是一个enum
enum Optional{
case nil:
case some(value:T):
}
- 定义的两种方式:
var OptionalString:String?
var OptionalString:Optional<String>
- 强制解析:在optional变量后面加个!,可以得到OptionalString中的非空值。
OptionalString!
- 自动解析:在声明optional变量时把后面的?改成!,OptionalString就自动为非空值。
var OptioanalString:String!
- if let 的用法:if let 叫做可选绑定(optional binding)。用来判断可选变量是否包含非空值,如果是就将非空值赋给一个变量或常量,不是就为false,不满足条件。
String mystring=" "
if let mystring=OptionalString{
statements
}
else{
statements
}
2、面向协议:
面向协议也是Swift 的一个特性,我还是先说为什么要使用protocol?
- protocol类似于类,可继承,但其独特的地方是,它可以用在结构体及枚举类型,使得它们遵循protocol后能使用protocol的属性和方法,也就是相对于类,protocol不仅能被引用类型(class)使用还可以被值类型(struct、enum)使用。
- 使用类时,父类是无法得到子类的类型信息的,而使用protocol允许得到其被遵循的类型的信息。
- 遵循时不需要初始化protocol。
- 可以使方法的实现更清晰。
然后,protocol是什么呢?
- protocol用于定义完成某项任务或功能所必须的方法和属性,协议实际上并不提供这些功能或任务的具体实现,而只用来描述这些实现是什么样的。
- 类、结构体及枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。
- protocol使用的是遵循协议的方法,数据类型是值类型。
- 有默认实现的扩展协议。
最后,怎么使用protocol?
- 定义protocol:
protocol Example{ statements }
- 类、结构体、枚举类型遵循protocol:
class ExampleClass: Example{
statements
}
struct ExampleStruct: Example{
statements
}
enum ExampleEnum: Example{
statements
}
- 协议可以规定其遵循者提供特定名称与类型的实例属性或类属性,必须指定属性是只读还是可读可写。在类型声明后加上{set get}表示属性可读可写,加上{get}表示只读。
- 协议可继承其他协议,方法同类继承。
- 协议中的方法想要修改实例的值,需要在方法前加 mutating 关键字修饰。
- 在类中指定协议中的构造器为其类构造器需要在类中的构造器前加上 required 修饰符。
- 协议可以作为类型使用,类似于结构体。
- 扩展协议,既可扩展标准库的协议也可以扩展第三方库的协议,通过扩展可以扩充已存在的类型,也可以为已存在类型添加属性、方法、下标脚本、协议。
- 类专属协议,限制协议只能适配到类类型,使用方法如下:
protocol Example:class,BaseProtocol{ statements }
- 协议合成,将多个协议合成在一起形成一个临时协议,使用方法如下:
protocol<ProtocolOne,ProtocolTwo>
3、闭包:
为什么要使用闭包呢?
- 答案很明显,当我们要重复使用某一代码块时,闭包则是尤为方便的东西。
- 可以根据上下文推断参数和返回值类型。
- 可以使用简化参数名。
那么闭包是什么呢?
- 闭包是一组用{ }括起来的自包含功能代码块,可在代码中使用或作为参数传值,与C、Object C的Block类似。
怎么使用闭包?
- 闭包有三种形式:
(1)全局函数:有名字但不能捕获任何值。
(2)嵌套函数:有名字,也能捕获封闭函数内的值。
(3)闭包表达式:无名闭包,使用轻量级语法,可以根据上下文环境捕获值,这是一般形式,如下:
{ (parameters) -> return type in
statements
}
实例: var max:(Int,Int)->Int={ //闭包接受两个Int参数,比较大小,将大的返回 (num1:Int,num2:Int)->Int in return num1>num2?num1:num2 }
- 如果闭包体只有一行代码,可以省略return。
- 参数名称缩写,Swift 自动为内联函数提供了参数名称缩写功能,可以直接通过$0、$1、$2来顺序调用闭包的参数。
- 尾随闭包,是一个书写在函数括号之后的闭包表达式
比如: func ExampleFunc(closure: () ->Void){ statements } //不使用尾随闭包 ExampleFunc({闭包statements }) //使用尾随闭包 ExampleFunc( ){ 闭包statements }