swift中Optional用法以及常问问题

很多同学问Optional中?和 !区别,弄清这个问题我们首先了解一下swift中Optional语法

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错:

var stringValue : String 
//error: variable ‘stringValue‘ used before being initialized
//let hashValue = stringValue.hashValue//                            

let hashValue = stringValue.hashValue

上面了解到的是普通值,接下来Optional值要上场了。提醒,Optional其实是个enum,里面有NoneSome两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因


声明为Optional只需要在类型后面紧跟一个?即可。如:

var strValue: String?   
//?相当于下面这种写法的语法糖

var strValue: Optional<String>

上面这个Optional的声明,意思不是”我声明了一个Optional的String值”, 而是”我声明了一个Optional类型值,它可能包含一个String值,也可能什么都不包含”,也就是说实际上我们声明的是Optional类型,而不是声明了一个String类型,这一点需要铭记在心。

一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:

if strValue {
    //do sth with strValue
    }

例子:

var opt: int?                         opt = 10
if opt != nil {                       if opt != nil{
  print("true")                           print("true")
}else{                                else{
  print("false")                          print("false")
}                                      }
用法
var inStr: String = "xxx"

var intOpt: Int? = Int(inStr)

if (intOpt != nil){
var intValue: Int = intOpt!
}

尝试使用!来访问不存在值的optional value 会触发运行时错误。当我们使用!来强制拆包(force-unwrap)的时候,

一定要确保这个optional value一定包含一个非nil 值。

隐式拆包可选值(Implicitly Unwrapped Optionals)

有时候,我们可以确定一旦变量或者常量被创建并初始化后,一直都会有值,那么可以就可以使用隐式拆包方式获取值。

在声明变量时,不是使用?来声明可选值,而是使用!来声明。

如:

let possibleString: String? = "An optional string."  
// 这是强制拆包  
println(possibleString!)  
  
let assumedString: String! = "An implicitly unwrapped optional string."  
// 不需要添加!来拆包  
println(assumedString)
时间: 2024-10-25 15:01:07

swift中Optional用法以及常问问题的相关文章

如何理解Swift中Optional的 ! 和 ?

很多人在刚上手swift时对于Optional中 '!' 和 '?' 的使用十分不理解,接下来我会谈一谈自己对于这两个符号的使用方式的理解. 先来说说Optional的概念,以方便之后的理解.来看一下下面的代码: var a : String = nil // 编译错误,String类型不能为nilvar b : String = "Hello!"12Swift 中的普通类型不再能设为nil.那如何表示这个值不存在呢?所以引进了Optional的概念:代表 nil 或某个具体的值.例如

C++11 std::function用法(c++常问问题十七)

C++11 std::function用法 直接上代码: 例子1:std::function的感觉就像是函数指针那样有木有 #include <iostream> #include <functional> #include <map> using namespace std; // 普通函数 int add(int i, int j) { return i + j; } //lambda表达式 auto mod = [](int i, int j){return i

面试常问问题:银行网上支付项目中怎么控制多线程高并发访问?

面试常问问题:银行网上支付项目中怎么控制多线程高并发访问? synchronized关键字主要解决多线程共享数据同步问题. ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题. ThreadLocal和Synchonized都用于解决多线程并发访问.但是ThreadLocal与synchronized有本质的区别: synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本,使 得每个线程在某一时

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

[HTML面试]HTML5 面试中最常问到的 10 个问题

1. HTML5 新的 DocType 和 Charset 是什么?HTML5 现在已经不是 SGML 的子集,DocType 简化为:                  <!doctype html>HTML 5 指定 UTF-8 编码的方式如下:                 <meta charset="UTF-8"> 2. 如何在 HTML5 页面中嵌入音频?HTML 5 包含嵌入音频文件的标准方式,支持的格式包括 MP3.Wav 和 Ogg:<

swift中的optional

optional一些理解和总结: Optional作为一种类型,既可以存储一个值,也可以为空(也就是swift里的nil): 其实为一个枚举类型,包含nil或者一个值,如下: enum Optional<T>: _Reflectable, NilLiteralConvertible { case None case Some(T) //... } 它只有两种状态,包含一个值或者为空:optional有效解决了值为空的清空:我们可以通过判断一个对象是否为空了做出相应解决,通过if let a =

Swift中的Optional类型 (可选类型)与强制解包 ? !

我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是不会给变量赋值初始值的,所以当你声明一个字符串变量的时候,var string:String   就会被系统报错,但是目前的swift版本却不报错了. 但是你要给一个字符串赋值未nil的时候,var string:String = nil 就一定是错误的   因为nil并不是一个字符串类型,而实际上

swift中collectionView的简单用法

之前写过OC中collectionView的用法,现在再看看swift中collectionView的用法,有兴趣的朋友,可以两者前后比较下区别,swift现在没有稳定下来,语法更新的比较快,但是它核心的一些东西,已经定型了.这些还是靠读者们自己去挖掘吧. //这里签署数据源和代理,此时不需要引入layout的代理,也可以.class AmonViewController: UIViewController ,UICollectionViewDataSource,UICollectionView

[翻译]理解Swift中的Optional

原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你第一次使用时可能会感到困惑.Optionals将会在编译阶段检查哪些值为nil.通过这种方式,你可以更好的保证应用程序交付在用户手里是可运行的.在Swift中,Optionals也提供了一些接口用来和遗留的Objective-C代码之间交互. 初试Optional 让我们在XCode中新建一个叫做s