//: Playground - noun: a place where people can play

import Cocoa

var str1 =
"供选链接和强制拆包的不同。

"

class Person {

var residence:
Residence?//供选连接

}

class Residence {

var rooms = [Room]()

var numberOfRooms:
Int {

return
rooms.count

}

subscript(i:
Int) ->
Room {

return
rooms[i]

}

func printNumberOfRooms() {

println("The number of rooms is
\(numberOfRooms)")

}

var address:
Address?

}

//假设你创建一个新的 Person
实例,它的 residence
属性因为是被定义为供选的,此属性将默认初始化为空:

//let john = Person()

/*

假设你想使用声明符!强制拆包获得这个人 residence
属性 numberOfRooms 属性值,将会引发执行时错误,由于这时没有能够供拆包的 residence
值。

*/

//let roomCount = john.residence!.numberOfRooms

//供选链接提供了一种还有一种获得 numberOfRooms
的方法。利用供选链接,使用问号来取代原来!的位置:

//let roomCount = john.residence?

.numberOfRooms

/*

if let roomCount = john.residence?.numberOfRooms {

println("john's residence has \(roomCount) room(s).")

} else {

println("Unable to retrieve the of rooms.")

}

john.residence = Residence()

if let roomCount = john.residence?

.numberOfRooms {

println("john's residence has \(roomCount) room(s).")

} else {

println("Unable to retrieve the of rooms.")

}*/

/*

为供选链接定义模型类

这些类是由上面的 Person
和 Residence 模型通过加入一个 Room
和一个 Address
类拓展来。

*/

class Room {

let name:
String

init(name:
String) {

self.name = name

}

}

class Address {

var buildingName:
String?

var buildingNubmer:
String?

var street:
String?

func buildingIdentifier() ->
String? {

if (buildingName !=
nil) {

return
buildingName

}
else
if (buildingNubmer !=
nil) {

return
buildingNubmer

}
else {

return
nil

}

}

}

//通过供选链接调用属性

let john =
Person()

if
let roomCount =
john.residence?.numberOfRooms {

println("John's residence has
\(roomCount) room(s).")

}
else {

println("Unable to retrieve the number of rooms.")

}

//通过供选链接调用方法

var uu =
9

if(john.residence?.printNumberOfRooms()
!= nil) {

println("It was possible to print the number of rooms.")

}
else {

println("It was not possible to print the number of rooms.")

}

//使用供选链接调用角标

if
let firstRoomName =
].name {

println("The first room name is
\(firstRoomName).")

}
else {

println("Unable to retrieve the first room name.")

}

Option可选值可选值(二)的更多相关文章

  1. bootstrap selectpicker 通过代码指定选中值 BootStrap selectpicker后台动态绑定数据 selectpicker 获取选中option的属性或者值

    bootstrap-select使用 bootstrap selectpicker 通过代码指定选中值 $('#subjectno').selectpicker('val',(row.subjectn ...

  2. Jquery获取select option动态添加自定义属性值失效

    Jquery获取select option动态添加自定义属性值失效 2014/12/31 11:49:19 中国学网转载 编辑:李强 http://www.xue163.com/588880/3909 ...

  3. 获取HTML网页中option标签元素的值

    在进行表单元素的操作时,难免会遇到对option元素的挑选,下面的示例代码能够很好的获取到你option元素选择的值,如果要传递给后端,可通过ajax或者其他方式传递即可. 示例代码 <!doc ...

  4. NPOI EXECL数据导入,日期格式调用DateCellValue取值时,二次或后续调用出现报错!

    NPOI version:2.5.1 EXCEL数据导入功能,第一次调用DateCellValue获得日期值OK,二次或后续调用出现报错"函数求值需要运行所有线程" 初步怀疑是版本 ...

  5. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  6. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  7. C++ 左值 右值

    最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C ...

  8. java将map拼接成“参数=值&参数=值”

    Java将Map拼接成"参数=值&参数=值" 把一个map的键值对拼接成"参数=值&参数=值"即"username=angusbao& ...

  9. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  10. Jmeter的JDBC Request,sql参数化及返回值取值

    1.JDBC Request面板 Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字 ...

随机推荐

  1. Linux signal那些事儿【转】

    转自:http://blog.chinaunix.net/uid-24774106-id-4061386.html Linux编程,信号是一个让人爱恨交加又不得不提的一个领域.最近我集中学习了Linu ...

  2. Linux内核情景分析之消息队列

    早期的Unix通信只有管道与信号,管道的缺点: 所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发 ...

  3. 安装glibc错误链接导致系统崩溃,u盘启动紧急救援模式下修复系统。

    Sln 命令  创建动态符号链接 用法 sln source  dest 故障案例:一个误操作 导致了一个不小的故障,输入所有命令都无效,直接系统无法启动. 故障描述 sln /usr/lib64/l ...

  4. BZOJ1457 棋盘游戏

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1457 这题神奇一些就在于这题的胜利条件不是拿走最后一张牌了而是走到(0,0). 然后就需要 ...

  5. 非常有用的开发工具之Android Studio插件

    我们都知道Eclipse开发Android将在今年年底google不再继续提供相应的开发支持,转而开始强烈发展Android Studio,现在我就分享几款能帮助团队提升工作效率的几个Android ...

  6. [笔记]Android 源码编译

    问题: 解决方法: 下载地址ftp://ftp.gnu.org/gnu/make/make3.8.2的安装步骤:tar -zxvf make3.8.2.tar.gz在make-3.8.2目录下./co ...

  7. linux中脚本扑捉(trap)信号问题

    扑捉ctrl+c信号: #!/bin/bash trap ; function trap() { echo "You press Ctrl+C."; echo "Exit ...

  8. setTag和findViewByTag的使用具体解释

    在使用ListView或者GridView的时候. 假设想要在Aciviry中获取到Item中的子View,比較频繁的使用是:getChildAt(int position): 之前自己差点儿不会去使 ...

  9. Win7如何解决精简版的迅雷7无法运行

    网上下载msvcp71.dll和msvcr71.dll把文件放到System32目录下即可   http://www.baidu.com/s?wd=msvcp71.dll&ie=utf-8&a ...

  10. linux 木马

    参考 http://wangzan18.blog.51cto.com/8021085/1740113 http://www.cnblogs.com/jluzhsai/p/3756280.html  ( ...