Object-C--->Swift之(二)可选类型

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 可选和nil的恋情 先看一个例子吧! let str="hello world" let num:Int=Int(str)这两行代码的意思str字符串转换成Int类型,嘿嘿!这不是坑计算机吗?hello world能转换成Int类型的数字吗?很显然不能,而且我们运行都不会通过的!可是我们把第二行代码换成 let num:Int?= Int(str)编译就通过了!就这样可选类型就呼之欲出!定义:在任何类型后面紧跟一个?就可以代表可选类型,可选类型的变量可用于处理“值缺失”的情况。

可选和nil的恋情

    先看一个例子吧!
    let str="hello world"
    let num:Int=Int(str)

这两行代码的意思str字符串转换成Int类型,嘿嘿!这不是坑计算机吗?hello world能转换成Int类型的数字吗?很显然不能,而且我们运行都不会通过的!

可是我们把第二行代码换成

   let num:Int?= Int(str)

编译就通过了!就这样可选类型就呼之欲出!

定义:

在任何类型后面紧跟一个?就可以代表可选类型,可选类型的变量可用于处理“值缺失”的情况。

Int类型的变量或常量只能接受Int类型的数据,而Int?可以接受值缺失的状况,也就是能接受值为nil。

     var age:Int=nil  这个显然是错误的
     var age:Int?=nil 这个是可以的

注意:Int?和Int类型并不是相同的类型,程序不能直接把Int?类型的变量或者常量直接拿来当Int类型的变量或常量使用。

强制解析

为了获取可选类型的常量或变量的实际存储值需要用在后面加!进行解析。这个!的含义是:已经知道该可选变量有值了(要是实际里面没有值系统就会崩溃),提取里面的值。这种添加感叹号进行解析的用法叫做强制解析。

    例如:
    let str1:String?="hello"
    let str2:String?=" word"
    let result = str1! + str2!
    print(result)

之前说了使用!的前提是可选变量确实有值了,否则就会崩溃,所以我们需要提前判断可选类型是否有值。所以上面的代码这样写才正规一些:

 let str1:String?="hello"
 let str2:String?=" word"
  if str1 != nil && str2 != nil
    {
    let result = str1! + str2!
        print(result)
    }
    else
    {
    print("str1或者str2为nil,不能强制解析")
    }
  }

隐式可选类型

除了在任意已有类型后面添加?来表示可选类型外,可以加!来表示可选类型。
其中Int?和Int! 类型的区别在于:当用Int?表示可选类型的时候必须用!后缀强制解析,而程序用!类型表示可选变量时,无需在后面增添!后缀执行强制解析。Swift会自动执行隐式解析。

   let str1:String!="hello"
   let str2:String!=" word"
    if str1 != nil && str2 != nil
    {
    let result = str1 + str2
        print(result)
    }
    else
    {
    print("str1或者str2为nil,不能强制解析")
    }

最后用一个表清晰展示下可选类型的差异吧!

Int Int? Int!
是否可存储整数
是否接受nil
是否需要强制解析为Int
相关文章
|
2月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
40 6
|
3月前
|
Java
Object当中的object类型
Object当中的object类型
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
148 0
|
4月前
|
Java 数据库
Java【问题记录 04】时间戳类型字符串{Timestamp@15601}2021-07-14 18:56:53.0变成带T的Object类型2021-07-14T10:56:53.000+0000
Java【问题记录 04】时间戳类型字符串{Timestamp@15601}2021-07-14 18:56:53.0变成带T的Object类型2021-07-14T10:56:53.000+0000
40 0
|
11月前
|
JavaScript 编译器
TypeScript-never和object类型、类型断言概述
TypeScript-never和object类型、类型断言概述
52 0
|
JavaScript
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
|
存储 JavaScript
【TS】object类型
【TS】object类型
74 0
|
缓存 算法 C#
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(下)
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(下)
93 0
|
缓存 算法 编译器
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(上)
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(上)
71 0
判断Object中数据类型(已知类型、未知类型))
判断Object中数据类型(已知类型、未知类型))
131 0