Swift基础-部分关键字说明与示例

权限修饰符

权限修饰符可以用来修饰类、结构体、枚举、变量、常量、函数等

五种权限修饰符的区别

  • 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)

  1. 使用"!"强制解析获取可选类型的值(不建议直接使用)
var str: String? = "Hello world"
if str != nil { // !=或==可以用来判断是否为nil
    print(str!) // 使用!强制解析
} else {
    print("值为nil")
}

//如果强制解析的常量或变量为nil,则运行崩溃。避免这种情况我们采用2中的可选绑定方案
let name?: String
print(name!)//运行崩溃
复制代码
  1. 使用可选绑定获取可选类型的值(建议的用法)
var str: String? = "Hello world"
if let newStr = str { // 如果str有值或类型转换成功,则将值赋值给newStr直接使用
    print(newStr)  // 使用newStr代替str,且不需要加!强制解析
} else {
    print("值为nil")
}
复制代码
  1. 隐式解析可选类型
var str: String!
str = "Hello world"
print(str) // 不需要使用!强制解析
// 还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃(在不确定值百分百存在的情况下我们全部采用可选绑定来取值操作)
str = nil
print(str)//编译通过,程序运行崩溃

复制代码
  1. 空合运算符(用于判断变量或常量是否为nil)
// 空合运算符:a ?? b 判断a是否为nil,若a不为nil对a解封,否则返回b的值
var status: Int? // 申明可选Int类型的变量status,初始值为nil
status ?? 0 // 因为status为nil,则返回0
// ?? 即为以下if else的缩写
func testOption() -> Int {
    let status: Int? = 1
    if status == nil {
        return 0
    } else {
        return status!
    }
}
复制代码
  1. 可选类型在错误处理中的运用
//  方式一: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)
复制代码
  1. 可选类型在类型转换中的运用
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
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值