optional swift_swift optional - CSDN
  • swift是一门类型安全的编程语言,声明的变量默认情况下是不能为非空值(nil)的,如果需要这个变量可为nil,那么就需要设置为可选类型。 可选类型其根源是一个枚举型,里面有None和Some两种类型。...

    swift是一门类型安全的编程语言,声明的变量默认情况下是不能为非空值(nil)的,如果需要这个变量可为nil,那么就需要设置为可选类型。



    可选类型其根源是一个枚举型,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因.


    强制解析

    上面说到可选型使用Some(T)包装(wrap)了原始值


    如图,即使我们知道str有值,但是直接输出是可选型而不是String类型。

    那么要从str中获得它的字符串值该如何获得

    swift中使用!来进行解包,即


    获得的就是str的字符串值

    注意:! 强制解析时必须保证可选类型不为nil,否则强制解析一个为nil的可选类型会报错

    fatal error: unexpectedly found nil while unwrapping an Optional value


    自动解析

    在声明可选型的时候把?替换为!即可。这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。


    可以看出,使用!声明的类型仍然是可选类型,在str为nil时仍为nil,在strTest有值时不需要使用strTest!就可以取到字符串值。

    强制解析与自动解析中的 ! 区别


    在声明时的 ! 只是对可选类型的一种声明方式。误区:有些人认为使用!声明的变量就必须为非空,其实不是这个意思。这里的 !是说在非空时str1取值取到的是解包后的值,而不再是Optional();

    在调用时的 ! 是强制解包,也就是求取Optional.Some(T)包装下的值,所以为 Optional值 = nil 时会报错

    可选绑定

    既然可选型可以为空,那么通常我们需要判断非空时要怎么处理,为nil时应该怎么处理。

    最常用的判断方式就是if语句了


    这是我们熟悉的if语句写法,swift提供了更方便的if let/var语句,也称为可选绑定


    为什么称if let是一个语句而不再是 if语句呢,因为


    if let strTemp = str5 时进行的是解析赋值。strTemp1 = str5!这时才和strTemp值相等。

    xcode中输入iflet会自动补全就像是forin语句,但是ifvar不会不全,但是不代表ifvar不可以


    可选链 Optional chaining

    为什么会有可选链呢?


    如图,我们使用可选值变量的时候各种判断有时候还需要if嵌套真的很麻烦,所以出现了可选链

    通过  ?  语法调用属性或者方法。即?出现在调用时,而不是出现在变量的定义中,称为可选链。


    ?返回一个可选值, 可选值为nil则代码语句执行结果为nil,可选值非空则继续往下执行。

    如:people.money?.canBuyIphone()中如果money为nil,则整个语句返回nil。如果money有值则执行canBuyIphone()方法,判断是否能购买iPhone

    也就是说可选链是一个可选值,一个为nil,一个为非nil


    空合运算符 ??

    什么是空合运算符呢, 符号表示就是 ??  ,有点类似三目运算符?:的变种


    还是上面的例子,我们把if let语句改成了三目运算符,有没有发现可选链组成的三目运算符是相当的霸气。而使用 ?? (空合运算符)就简短了不少。

    x ?? y表示判断x是否为nil,若不为nil,则将x解包后返回,否则,取y的值

    展开全文
  • swiftoptional的使用

    2018-04-13 21:36:22
    在c/c++中常用0、null来代表没有值,swift中发展出optional来替代这种有风险的做法? 和 ! 都可以用来定义optional的变量!还可以用来强迫解包,不过用!定义的optional表示肯定有值,用!就是省略了那些不必要的检查...

    在c/c++中常用0、null来代表没有值,swift中发展出optional来替代这种有风险的做法

    ? 和 ! 都可以用来定义optional的变量

    !还可以用来强迫解包,不过用!定义的optional表示肯定有值,用!就是省略了那些不必要的检查,但是有风险

    var x:Int? = 8

    1、差的使用办法

    x!+ 2

    2、比较差的处理方法

    if x != nill {

      x = x! + 1

    }

    3、推荐的处理方法

    var x:Int? = 8

    if let myNumber = x {

      myNumber + 1

    }

    highScore = loadedScore != nil ? loadedScore! : 0

    highSrore = loadedScore ?? 0


    展开全文
  • var optionalString: String? = "facial"; var greeting = "hi"; if let name = optionalString { //把optionalString复制给一个临时变量 name. 可以判断optionalString是否有值, greeting = greeting + " \...

    var optionalString: String? = "facial";

    var greeting = "hi";

    if let name = optionalString//optionalString复制给一个临时变量 name. 可以判断optionalString是否有值,

        greeting = greeting + " \(name)" ;

    }

    print(greeting);

    转载于:https://www.cnblogs.com/facial/p/5254296.html

    展开全文
  • //1.1 optional(可选...//optionalSwift中非常重要的类型,Swift底层设计中也大量使用了optional。因此深入理解optional类型很有必要 //一个可选类型变量可以理解为一个枚举 enum Optional<T>{ case None case Som
    //1.1 optional(可选类型)
    //刚接触optional类型的时候其实,其实我是拒绝的,因为这个类型这么奇怪,你不能让我用,我就去用。
    //optional是Swift中非常重要的类型,Swift底层设计中也大量使用了optional。因此深入理解optional类型很有必要
    //一个可选类型变量可以理解为一个枚举
    enum Optional<T>{
    case None
    case Some(T)
    }
    let x: String? = nil
    //相当于
    let x: String? = Optional<String>.None
    
    let x: String? = "hello"
    //相当于
    let x: String? = Optional<String>.Some("hello")
    
    //那么
    var y = x!
    //可以解释为下面这段代码
    switch x{
    case Some(let value): y = value
    case None://触发一个异常
    }
    
    //1.2 可选绑定(optional binding)
    //可选绑定通常用于判断可选类型的变量或常量是否有值,如果有值就赋给另一个临时的变量或常量。可选绑定可用在if分支或while循环中对可选类型的值进行判断,并将值赋给变量或者常量。for example
    var str: String? = "hello swift"
    if let tmp = str{
        //str != nil
        println("\(tmp)")
    }else{
        //str == nil
        println("str equals nil")
    }
    
    //1.3 隐式可选类型
    //除了在类型后面添加?来表示可选类型外,Swift允许在类型后添加!表示可选类型。Int?和Int!的区别是:当程序需要获取Int?类型的变量或常量的值时,程序必须在变量名添加!执行强制解析;而获取Int!类型的变量或常量的值时,无需添加!进行强制解析,Swift会自动执行隐式解析。举个栗子
    var str1: String? = "hello swift"
    //对于String?可选类型,必须使用!进行强制解析
    var tmp: String = s1!
    var str2: String! = "hello swift"
    //直接赋值,无需显式强制解析
    tmp = str2
    展开全文
  • 在转换String时要使用“!”进行拆包,用“?”则会有optional 出现
  • swift-可选类型Optional

    2017-10-19 14:38:46
    Swift 引入的 Optional,很好的解决了 Objective-C 时代 “nil or not nil” 的问题,配合 Type-Safe 特性,帮我们减少了很多隐藏的问题。下面让我们通过源码来了解一下 Optional 具体的实现逻辑。 初识 Optional ...
  • Optional在Objective-C中定义对象,初始默认值为nil,如果给nil发送消息,并不会崩溃,只是不会有任何作用。 Swift语言使用var定义变量,但是变量是没有初始值的。所以要求使用变量之前必须要对其初始化,否则会...
  • 因为 Optional 是可选值类型 加! 强制拆包即可 参考 http://blog.csdn.net/zhangao0086/article/details/38640209
  • 如何理解SwiftOptional的!和?

    千次阅读 2017-09-11 11:03:32
    很多人在刚上手swift时对于Optional中 ‘!’ 和 ‘?’ 的使用十分不理解,接下来我会谈一谈自己对于这两个符号的使用方式的理解。
  • swift 中,protocol的optional方法

    千次阅读 2017-03-27 08:44:09
    swift推出一年多了,断断续续学了一些,一直没有真正引入自己的项目中。 最近准备做一个 Today Extension,恰好是一个机会可以完整的使用swift开发。刚刚做了几天,就发现又一次被Apple忽悠了,感觉就像iOS6.0时代...
  • Swift 可选值(Optional Values)介绍

    万次阅读 热门讨论 2015-03-09 11:39:06
    Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也和Objective-C有些不一样,在...
  • 刚刚开始学习swift,欢迎大家一起讨论! Optional这个概念其实刚开始看了好久都没看懂,不太明白这个东西到底有什么意义,能够解决什么问题,到底怎么去使用,现在有了初步的理解,跟大家分享一下,欢迎指正。 1....
  • Swift4.0中 String的 Optional在String作为urlString去初始化url并进行网络访问时,会出现url为Optional包string的错误情况  如:在AFNetwork3.1的get请求中使用Optional 类型的 String时,会有如下错误: ...
  • Swift中的Optional解释
  • SwiftOptional类型

    2015-03-15 13:16:02
    我们使用Swift这个苹果新推出的编程语言已经有一段时间了。其中的一个极大的优点就是苹果称为“optional types”的东西。几乎所有的objective-c程序员都知道用nil来表示某个引用类型的对象是没有值的。但是要把nil和...
  • Optional<NSNumber>-String存放字典中作为请求参数上传时,请求参数不正确,被包裹了一层。session=1 变成 session=some(1).
  • Require[Swift] 将Optional值require为nonnil或优雅崩溃
  • swift 可选(optional

    2016-02-17 00:45:36
    可选类型swift中提供了可选(optional)机制,用来处理值可能为空的情况。可选类型有两种状态,一种是有值,为x,另一种状态是没有值。下面来看个例子:我们在开发中可能会希望将一个字符串转化为整数数字,但是又不...
  • Swift3.0 Optional String 类型 强制拆包

    千次阅读 2017-03-15 16:44:03
     Swift3.0中 String的 Optional在String作为urlString去初始化url并进行网络访问时,会出现url为Optional包string的错误情况  如:在AFNetwork3.0的get请求中使用Optional 类型的 String时,会有如下错误:  /...
1 2 3 4 5 ... 20
收藏数 8,262
精华内容 3,304
关键字:

optional swift