XZ_Swift之! 、? 和 ?? 的区别

1、定义可选项
‘?’ 定义可选项
‘!’对可选项解包,强行解包
不同类型的值,不能直接运算!如果没有值是 nil 不是任何数据类型,不能参与计算
‘!’强行解包 - 从可选值中强行获取对应的非空值,如果值是 nil,就会崩溃!

// 定义:‘?’用来定义 y 是一个可选的Int类型,可能没有值,也可能是一个整数
let y: Int? = 20
print(y!)
// 定义模型属性的时候,如果是对象,通常是可选的,使用?
var vipIcon: UIImage?

2、as 类型转换
1>、as?/as! 直接根据前面的返回值决定:前面的是可选的,就加 ? ,前面不是可选的就加 ! 号
2>、if let / guard let 判断语句,一律使用 as?

// MARK: - 控制器跳转方法
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 因为 segue.destination 不是可选值,所以 as 后面跟 ! 
    let vc = segue.destination as! XZDetailViewController
    if let indexpath = sender as? IndexPath {
            // indexPath 一定有值
            vc.person = personLists[indexpath.row]
            // 刷新指定行
            self.tableView.reloadRows(at: [indexpath], with: .automatic)
    }
}

3、闭包回调
在 OC 中执行 block 前都需要判断是否有值,否则会崩溃!,
Swift 中 的闭包要使用可选解包

// 定义闭包 -> 实现回调 
// var completion: ()->()? 错误
    var completion: (()->())?
// 调用 -> ? 可选解包(如果闭包为 nil,就什么也不做!),如果没有添加 ? ,Xcode 会帮助修订,添加一个 !(强制解包),但是一定不要用 ‘!’
    completion?()

4、可选解包
// ! 是强制解包,在参与计算的时候,需要使用强制解包;
// 代码中的 ? 都是 ‘可选’解包,只用来发送消息,不参与计算;
// 所有的 ? 都是 Xcode 自动添加的!

var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // 1.创建window
        window = UIWindow()
        window?.backgroundColor = UIColor.white

        // 2.设置根控制器
        window?.rootViewController = XZMainViewController()

        // 3.window可见
        window?.makeKeyAndVisible()

        return true
    }

?? 运算符
?? 运算符用于判断 变量/常量 的数值是否是 nil ,如果是则使用后面的值替代;在Swift开发中, ?? 能够简化代码的编写。

// MARK - 可选项使用 ?? 的判断
func controlFlow3(x: Int?, y: Int?) {
     /**
       ?? 是一个简单的三目
       - 如果有值,使用值;如果没有值,使用 ?? 后面的值替代
     */
     print((x ?? 0) + (y ?? 0))
     let name: String? = "张三"
     // ?? 操作符号的优先级'低',在使用的时候最好加上小括号包裹
     print("Hello" + (name ?? "Anyone"))
     // 打印结果:Hello张三

     let name2: String? = nil
     print("Hey" + (name2 ?? "嗯哼"))
     // 打印结果:Hey嗯哼
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值