权限修饰符
权限修饰符可以用来修饰类、结构体、枚举、变量、常量、函数等
五种权限修饰符的区别
private
修饰的属性或者方法只能在当前类里面访问。fileprivate
访问级别所修饰的属性或者方法在当前的Swift源文件里可以访问internal
(默认访问级别,internal修饰符可写可不写) internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。 如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。 如果是App代码,也是整个App代码,也是在整个App内部都可以访问。public
可以被任何人访问,但是在其他module中不可以被重写和继承,而在本module中可以重写和继承open
可以任何人使用,包括重写和继承
权限大小顺序是
private
< fileprivate
< internal
< public
< open
子类的访问权限不会高于父类
static、class
- Swift 中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是 static 和 class。
- 被static修饰的属性和方法称为类型属性和方法,反之则为实例属性和方法。
- 它们最大的区别在于class一般是用在class类型的上下文中,而static可以用在enum、struct、protocol和class中。
- 在两者都使用在class中时,static修饰的不能在其子类中重写而class可以。
available()
// 判断当前版本是否 iOS8.0+,OSX10.10+以及以其他平台if #available(iOS 8.0, OSX 10.10, *) { } // 也可以放在方法前面, 使其方法在某个版本可用// iOS8.0+,OSX10.10+以及以其他平台可用@available(iOS 8.0, OSX 10.10, *) func startUserActivity() -> NSUserActivity { }复制代码
optional (可选类型)
Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)
Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)
let name?: String复制代码
声明了一个可选类型的name常量(表示name可能为nil)
- 使用"!"强制解析获取可选类型的值(不建议直接使用)
var str: String? = "Hello world"if str != nil { // !=或==可以用来判断是否为nil print(str!) // 使用!强制解析} else { print("值为nil")}//如果强制解析的常量或变量为nil,则运行崩溃。避免这种情况我们采用2中的可选绑定方案let name?: Stringprint(name!)//运行崩溃复制代码
- 使用可选绑定获取可选类型的值(建议的用法)
var str: String? = "Hello world"if let newStr = str { // 如果str有值或类型转换成功,则将值赋值给newStr直接使用 print(newStr) // 使用newStr代替str,且不需要加!强制解析} else { print("值为nil")}复制代码
- 隐式解析可选类型
var str: String!str = "Hello world"print(str) // 不需要使用!强制解析// 还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃(在不确定值百分百存在的情况下我们全部采用可选绑定来取值操作)str = nilprint(str)//编译通过,程序运行崩溃复制代码
- 空合运算符(用于判断变量或常量是否为nil)
// 空合运算符:a ?? b 判断a是否为nil,若a不为nil对a解封,否则返回b的值var status: Int? // 申明可选Int类型的变量status,初始值为nilstatus ?? 0 // 因为status为nil,则返回0// ?? 即为以下if else的缩写func testOption() -> Int { let status: Int? = 1 if status == nil { return 0 } else { return status! }}复制代码
- 可选类型在错误处理中的运用
// 方式一:try方式 程序员手动捕捉异常 do { try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) } catch { // error异常的对象 print(error) } // 方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象 guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else { return } // 方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃) let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)复制代码
- 可选类型在类型转换中的运用
class SuperClass { // 这是一个父类}class SubClass: SuperClass { // 这是一个子类}let superClass = SuperClass()if let someClass = superClass as? SubClass { // 如果转换成功,则用someClass使用即可} else { // 转换失败}复制代码
if let (可选绑定)
let name: String? = "Hello world"// if let 连用,判断对象的值是否为'nil'if let nameNew = name { // 进入分支后,nameNew 一定有值不需要解包 print(nameNew)}复制代码
gurd (let)
guard let和if let刚好相反,guard let守护一定有值。如果没有,直接返回。 这个新的语法允许你在一个代码周期中构建一个提前的退出点, 避免了大量的if 判断 如果 a >= b 就会进入else直接退出
guard a < b else { return }
let name: String? = "Hello world"guard let nameNew = name else { print("name 为nil") return}// 代码执行至此, nameNew 一定有值print(nameNew) // 输出:Hello world复制代码