随手记Swift基础和Optional Type(问号?和感叹号!)
距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序猿,要求有一天工作经验”的帖子。
看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift。或者铃木雨燕。

这几天网上关于Swift的话题和材料应该迅速膨胀,比方StackOverflow的相关标签,还有知乎上的一些相关讨论。
关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发人员不算是非常大的冲击,毕竟写代码这门功夫,比較注重内功修炼。而对于功能越强大越灵活的语言。有可能高手拉开的距离更大。比方我非常久曾经转载的一篇怎样消除Python列表中的反复元素。
初步看下来,觉得Swift有点像JavaScript,又有点Python的风格,再看还有C++的特性。总的下来。有点“杂糅”或“博採众长”的味道,下面是一些基础代码演示样例:
为了体现playground的效果,我在这里上传了截图,而不是直接贴代码。讲到这个,可见从某种角度来看,大家都在同一起跑线上,毕竟连怎么看日志输出都能够在SO上收获非常多reputation,哈哈。
上面的代码我仅仅截取了部分。还有部分例如以下:
var arr = [0, 1, 2]
for item in arr {
println(item)
} var dict = ["k1": "v1", "k2": "v2"]
for item in dict.keys {
var s = item + dict[item]!
println(s)
}
我随手写了遍历数组和字典的代码。结果遇到问题了。
注意倒数第三行末尾有个感叹号。假设不加这个感叹号,会报错:
这里提到了“optional type”、“String?”和“not unwrapped”等概念。
在《The Swift Programming Language》的Language Guide - The Basics这一章中,紧跟Tuples小节的就是Optionals小节(之前的A Swift Tour也有掠过)。
依据这一小节开头的两行演示样例代码。我们能够得知有一种新类型是在既有类型后面加问号?:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFzb25ibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
这样的类型叫做“Optional Type”。參考Swift的类型声明,我们尝试声明Optional类型看看:
var oVar: Optional
编译器会报错:
Playground execution failed: error: <REPL>:46:11: error: reference to generic type 'Optional' requires arguments in <...>
var oVar: Optional
^
generic type 'Optional' declared here
依据错误提示,我们能够得知这是个泛型类型。须要指定详细的类型:
var oVar: Optional<Int>
于是我们能够跳进去查看Optional的详细定义:
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
}
此时再看剩下的代码:
再结合官方文档的描写叙述,能够得到例如以下几点结论:
- Int? 等价于 Optional<Int>,是一种语法糖;
- 上述 Int? 类型的变量 oVar 表示 oVar 要嘛包括Int类型的数据,要嘛为nil —— 非Optional Type的变量不能赋值为nil。也就是说。Optional类型同意变量没有值,其他类型假设没有初始化值在使用时会报错 —— 比方通过下标訪问数组元素时返回Optional类型,越界时能够返回nil;
- 在声明一个Optional类型变量时假设没有赋初始值,那么默觉得nil;
- Optional类型变量的真实值是被封装起来的,包装在其枚举值Some中,如上{Some 123};
- 使用问号?表示封装(可能有值可能没有)。使用感叹号。表示拆封取值(强制觉得有值,假设没有则会触发执行时错误)。有点相似“Has a value?
” —— "I assure it has!";
- 因为Optional枚举类型遵循LogicValue协议。所以能够作为逻辑推断条件,当有值时为true,不包括值时为false;
在ARC这一章中有一节叫“Unowned References and Implicitly Unwrapped”讨论了一种适用场景。除此之外,Optional Chaining也给了整整一个章节,这里就不继续展开了。
:)
随手记Swift基础和Optional Type(问号?和感叹号!)的更多相关文章
- swift:Optional Type 、Swift和Objective-C混编的讲解
❤️❤️❤️swift中的Optional Type的?和!含义:其实就是一个装包和拆包的过程 optional的含义: Optional事实上是一个枚举类型,Optional包含None和Some两 ...
- Swift基础语法(常量变量、数据类型、元组、可选、断言)
本文来自Swift中文开发组,感谢翻译者的分享. 本文将分几部分对Swift对ios的语法做讲解.本文为第一节,主要讲解基础语法. 常量和变量 常量和变量把一个名字(比如maximumNumberOf ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
- Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- swift基础知识学习
用let来声明常量,用var来声明变量 声明变量: var x = 0.0, y = 0.0, z = 0.0 var welcomeMessage: String 常量和变量的命名 你可以用任何 ...
- swift中,Optional、?与!之间的关系
swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...
- Initializer for conditional binding must have Optional type, not 'String'
今天看到问Swift问题: Initializer for conditional binding must have Optional type, not 'String' 以前没遇到过这个问题, ...
随机推荐
- Snip for Mac(桌面截图工具)安装
1.软件简介 Snip 一款用于桌面截图的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 Snip for Mac v2.0 (5771) fgab macOS 10.6.8 及以上 ...
- 当 Swoole 遇上 ThinkPHP5 世界你好
本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展 可以通过 pecl 命令或者通过源码包编译安装,本文采用 p ...
- 如何提升RDS响应速度
如果采用短连接的方式连接RDS,请在与RDS相连的云服务器上执行以下命令来提升RDS响应速度.(注:云服务器要有公网带宽) 1.安装nscd 云服务器上执行命令 Ubuntu系统执行:apt-get ...
- vmware虚拟机三种网络连接方式
一.概述 vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“ ...
- cocos2d 2.0和UIKit混合编程, Push CCDirector的时候出现黑屏的天坑
症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...
- 向量运算 与 JavaScript
二维向量都包含两个值:方向(direction)及大小(magnitude) 这两个值可以表达出各种各样的物理特性来,比如力和运动.如两个物体间的碰撞检测. 向量的大小 虽说二维向量是对大 ...
- Python 爬虫 使用正则去掉不想要的网页元素
在做爬虫的时候,我们总是不想去看到网页的注释,或者是网页的一些其他元素,有没有好的办法去掉他们呢? 例如:下面的问题 第一种情况<ahref="http://artso.artron. ...
- 使用cronolog自动分割apache的日志。
为了方便分析网站的日志,需要将apache的日志按周来分割,网上搜索了下,cronolog可以完成这个功能,实际操作了下,操作过程中参考了这篇文章(http://www.lampbo.org/linu ...
- xbox360 双65厚机自制系统无硬盘 U盘玩游戏方法
因为没有硬盘,又没有光盘.所以想把游戏放在U盘里面.用U盘来做为硬盘玩游戏. 现有的自制系统主要是FSD,但是FSD要用硬盘才能安装,理论上U盘也可以,但是我没有尝试了. 这里介绍的是玩xex格式的游 ...
- Atitti html5 h5 新特性attilax总结
Atitti html5 h5 新特性attilax总结 Attilax觉得不错的新特性 3.语义Header和Footer (The Semantic Header and Footer) 8.占位 ...