swift定义可选型的时候,要用“?”,可是在swift的标准库中,可选型的定义是Optional<T>,”?

”仅仅是个简写形式。


var myNum: Int?
var myNum: Optional<Int>
两句等价

能够看出可选型是个泛型,而Optional又是个枚举。Optional能够是 None,也能够是Some(T):

protocol Reflectable {

    /// Get the mirror that reflects this object.

    func getMirror() -> Mirror

}

protocol LogicValue {

    func getLogicValue() -> Bool

}

enum Optional<T> : LogicValue, Reflectable {

    case None

    case Some(T)

    init()

    init(_ some: T)



    /// Allow use in a Boolean context.

    func getLogicValue() -> Bool



    /// Haskell's fmap, which was mis-named

    func map<U>(f: (T) -> U)
-> U?

    func getMirror() -> Mirror

}

从定义中能够看出,可选型是符合LogicValue协议的,所以。能够被用在if推断中。那么这里就有一个非常好玩的事情了:在swift中。Int并不能够写在 if中。比方:
var a:Int = 3
if a {          //这里会报错
     println(“hehe")
}

可是我们学过扩展,我们能够自行让Int写在if中:
extension Int:LogicValue {
         //我让Int遵循了LogicValue协议

    func getLogicValue() -> Bool {     //实现LogicValue协议的要求

        if self != 0 {
              //非0的话,返回true,否则返回false

            return true

        } else {

            return false

        }

    }

}



var a:Int = 3



if a {     //这里不会报错了!

println("hehe")

}

是不是忽然认为非常灵活,非常好玩。

。。

仅仅要附合语言解析的逻辑,就能够创造出非常多玩法。

。。

可是。。。这不过玩玩,千万别用在项目里,假设真要用。这也不过语法糖。

。。



隐式解析可选型
之前提到可选型 “?

”是Optional<T>的简写形式。

”!”则是ImplicitylyUnwrappedOptional<T>的简写形式。这叫做隐式解析可选型

如同可选型一样,隐式解析可选型也能够写成两种形式:

var num:Int!
var num:ImplicitlyUnwrappedOptional<Int> 

swift 进阶笔记 (一) —— 可选型的更多相关文章

  1. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  2. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  3. Swift的笔记和参考

    原文:Swift的笔记和参考 好久没来了,趁着新语言Swift发布,继续钻研中! Create Class 创建类 (多态效果) // Create Class 创建类 class MyClass { ...

  4. Angularjs进阶笔记(2)-自定义指令中的数据绑定

    有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊到底怎么用这个话题. 一. 自定义指令 自定义指令,是Angularjs用来实 ...

  5. javascript进阶笔记(2)

    js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用.在js中,我们通常要大量使用函数式编程风格.函数式编程专注于:少而精.通常无副作用.将函数作为程序代码的基础构件块. 在函 ...

  6. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  7. Android进阶笔记:AIDL内部实现详解 (二)

    接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...

  8. 记录:swift学习笔记1-2

    swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...

  9. Swift 进阶

    iOS开发系列--Swift进阶 2015-09-21 00:01 by KenshinCui, 3072 阅读, 12 评论, 收藏, 编辑 概述 上一篇文章<iOS开发系列--Swift语言 ...

随机推荐

  1. C++ - Operator Precedence

    The following table lists the precedence and associativity of C++ operators. Operators are listed to ...

  2. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  3. android binder机制之——(创建binder服务)

      Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...

  4. google 搜索url详解

    www.google.com [http://www.google.cn/search?q=112&hl=zh-CN&client=aff- 360daohang&hs=yhE ...

  5. uva--562Dividing coins +dp

    题意: 给定一堆硬币,然后将他们分成两部分,使得两部分的差值最小;输出这个最小的差值. 思路: 想了好久都没想到一个合适的状态转移方程.后面看了别人的题解后,才知道能够转成背包问题求解. 我们将全部的 ...

  6. Function 详解(一)

    一直想写一系列关于javascript的东西,可惜从申请博客以来就一直抽不出时间来好好写上一番,今天终于熬到周末,是该好好整理一下,那么先从声明函数开始吧; 总所周知,在javascript中有匿名函 ...

  7. WM_PARENTNOTIFY的作用(不完全)

    VCL里源码如下: procedure TWinControl.WMParentNotify(var Message: TWMParentNotify); begin with Message do ...

  8. Android ARM汇编语言

    简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语 ...

  9. hdu 1024(dp)

    传送门:Max Sum Plus Plus 题意:从n个数中选出m段不相交的连续子段,求这个和最大. 分析:经典dp,dp[i][j][0]表示不取第i个数且前i个数分成j段达到的最优值,dp[i][ ...

  10. 在Activity中为什么要用managedQuery()

    刚開始接触android的时候,每次用数据库都会犹豫使用哪种方式,一种是getContentResolver().query(...),还有一种是managedQuery(...),后来习惯了使用前一 ...