一、访问控制(open,public,final,private,internal)
1、open
open func 在任何地方都可以访问和重载/重写(override)
open class 在任何地方都可以访问和继承
2、private
private func 只有在类内部可以访问
private class 只有在类内部可以访问
3、 public
private func 在类内部可以访问和重写 ,外部只能访问
private class 只有在类内部可以访问和继承,外部只能访问
4、final
public final class 类不能被继承
5、internal(默认访问级别,可以不写)
Internal 在库或者框架内部都可以访问,但是引用库或者框架不能访问
访问权限:open>public>internal>private
二、protocal 协议
swift中的协议类似其他语言的结构,和OC中的protocal没什么区别,在delegate中经常使用,主要用于数据回调。
不同是:swift中结构体和枚举可以遵循协议
常用protocal:UITableViewDelegate等
三、throws
swift中异常处理定义
func asURL() throws -> URL
四、guard
guard是swift2出现的新关键词,guard和if类似,都是判断后面的代码是否为ture,如果是true就向下执行,否则执行else中代码
使用方法 guard statement else { }
五、let var
抛弃了OC中 alloc init的写法,直接调用类名作为实例化方法
声明不可变量使用 ,变量一旦创建就不能变了
一般形式:let (变量名):(类型) = (值)
如果创建时没有指定类型,系统会自动判断
let a = 1.0 // Double
leta:Float=1.0// Float
六、数据类型(Int ,Float, Double,String,Optional,匿名类型 )
Int:整数类型
Float, Double:浮点型,Double是64位浮点数,Float是32位,Double精度高,也就是Float的双倍!
Optional:可选类型
Optional为了处理值缺失的情况,可以表示”那里有值并且等于x“或者”那里没有值“
定义:var OptionalInteger: Optional
注意:Optionals 为了区分有没有值,但是一定有类型,所以在定义的时候一定要定义类型
另一种写法: var OptionalInteger: Int?
Optional本质是个枚举 None 和 Some(T)
Optional存在的意义
在OC中经常出现nil:表示无类型指针,数组等不能放入nil,对象变量都可以是nil,nil智能用在对像上,其他地方用其他方式表示缺失值比如NSNotFound
swift做了一个统一:Optional不是指针,而是一个缺失值,Optional不仅是对象,而是任意类型
使用:
1、缺失值强制展开
如果Optional值缺失,直接使用!,会出现运行时错误
2、if语句和强制展开
如果一个Optional有值,可以使用 OptinalInteger!访问
var myString:String?
myString = "Hello, Swift!"
if myString != nil { // 强制解析 print( myString! )}else{ print("myString 值为 nil")}
3、绑定
如果包含值就赋给临时变量,可以对多个optinal变量进行判断,使用逗号隔开
if let constantName = someOptional { statements}
4、隐式展开(自动解析)
在赋值时候如果有值,可以使用!定义,不需要每次都判断
var myString:String!
主要用在类型初始化的时候
5、可选链
optional后面加?,如果可选项不为nil则返回值,如果任意环节是nil则返回nil。
let usecar = person?.owner?.permission?.usecar ?? true
匿名类型
1、AnyObject:一个成员为空的协议,所有的都实现了这个协议,它可以指向任何的类事例,相当于OC中的id。应用:限制协议只能应用于类使用,AnyObject不允许使用结构体和枚举。
2、Any:空协议集合的别名,表示没有实现任何协议,它可以是任何类、结构、枚举的实例。
3、AnyClass:AnyObject.Type 的别名(typealias)
七、特殊关键字
~= 判断一个值是否在范围内
八、泛型
泛型和Any的区别
Any会避开类型检查,并且在函数中出参和入参类型可能不一样,在函数定义时候尽量不要用