随手记Swift基础和Optional Type(问号?和感叹号!)

转载 2014年11月30日 06:13:43

距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序员,要求有一天工作经验”的帖子。

看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕。偷笑

这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论

关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发者不算是很大的冲击,毕竟写代码这门功夫,比较注重内功修炼。而对于功能越强大越灵活的语言,有可能高手拉开的距离更大,比如我很久以前转载的一篇如何消除Python列表中的重复元素

初步看下来,觉得Swift有点像JavaScript,又有点Python的风格,再看还有C++的特性。总的下来,有点“杂糅”或“博采众长”的味道,以下是一些基础代码示例:


为了体现playground的效果,我在这里上传了截图,而不是直接贴代码。说到这个,可见从某种角度来看,大家都在同一起跑线上,毕竟连怎么看日志输出都可以在SO上收获很多reputation,哈哈。

上面的代码我只截取了部分,还有部分如下:

  1. var arr = [0, 1, 2]  
  2. for item in arr {  
  3.     println(item)  
  4. }  
  5.   
  6. var dict = ["k1""v1""k2""v2"]  
  7. for item in dict.keys {  
  8.     var s = item + dict[item]!  
  9.     println(s)  
  10. }  

我随手写了遍历数组和字典的代码,结果遇到问题了。

注意倒数第三行末尾有个感叹号!如果不加这个感叹号,会报错:


这里提到了“optional type”、“String?”和“not unwrapped”等概念。

在《The Swift Programming Language》的Language Guide - The Basics这一章中,紧跟Tuples小节的就是Optionals小节(之前的A Swift Tour也有掠过)。

根据这一小节开头的两行示例代码,我们可以得知有一种新类型是在既有类型后面加问号?:


这种类型叫做“Optional Type”。参考Swift的类型声明,我们尝试声明Optional类型看看:

  1. var oVar: Optional  

编译器会报错:
  1. Playground execution failed: error: <REPL>:46:11: error: reference to generic type 'Optional' requires arguments in <...>  
  2. var oVar: Optional  
  3.           ^  
  4. generic type 'Optional' declared here  

根据错误提示,我们可以得知这是个泛型类型,需要指定具体的类型:
  1. var oVar: Optional<Int>  

于是我们可以跳进去查看Optional的具体定义:
  1. enum Optional<T> : LogicValue, Reflectable {  
  2.     case None  
  3.     case Some(T)  
  4.     init()  
  5.     init(_ some: T)  
  6.   
  7.     /// Allow use in a Boolean context.  
  8.     func getLogicValue() -> Bool  
  9.   
  10.     /// Haskell's fmap, which was mis-named  
  11.     func map<U>(f: (T) -> U) -> U?  
  12.     func getMirror() -> Mirror  
  13. }  

此时再看剩下的代码:


再结合官方文档的描述,可以得到如下几点结论:

  1. Int? 等价于 Optional<Int>,是一种语法糖;
  2. 上述 Int? 类型的变量 oVar 表示 oVar 要嘛包含Int类型的数据,要嘛为nil —— 非Optional Type的变量不能赋值为nil;也就是说,Optional类型允许变量没有值,其它类型如果没有初始化值在使用时会报错 —— 比如通过下标访问数组元素时返回Optional类型,越界时可以返回nil;
  3. 在声明一个Optional类型变量时如果没有赋初始值,那么默认为nil;
  4. Optional类型变量的真实值是被封装起来的,包装在其枚举值Some中,如上{Some 123};
  5. 使用问号?表示封装(可能有值可能没有),使用感叹号!表示拆封取值(强制认为有值,如果没有则会触发运行时错误),有点类似“Has a value?” —— "I assure it has!";
  6. 由于Optional枚举类型遵循LogicValue协议,所以可以作为逻辑判断条件,当有值时为true,不包含值时为false;

在ARC这一章中有一节叫“Unowned References and Implicitly Unwrapped”讨论了一种适用场景,除此之外,Optional Chaining也给了整整一个章节,这里就不继续展开了。

:)

相关文章推荐

随手记Swift基础和Optional Type(问号?和感叹号!)

距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序员,要求有一天工作经验”的帖子。看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org...

Swift Optional Type(问号?和感叹号!)的理解和使用

两个礼拜搞定iOS,那是吹牛吹出来的。呵呵,不过经过几天的学习还是觉得iOS还是很熟悉的,觉得有javascript的一些特征,有一些java的特征,貌似swift集大家所成的一门语言,本人还是比较喜...

《从零开始学Swift》学习笔记(Day 28)——总结使用问号(?)和感叹号(!)

原创文章,欢迎转载。转载请注明:关东升的博客  在使用可选类型和可选链时,多次使用了问号(?)和感叹号(!),但是它们的含义是不同的,下面我来详细说明一下。 1. 可选类型中的问号(?)声明这个类型是...

Swift中的问号和感叹号详解

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

swift学习3 数据类型的可选值 optional type

swift不仅要求类型安全,还尽力保证数据安全,未赋值的变量不允许使用那么如果一开始不想赋值,就需要可选值定义,在类型后加问号?输出值为 nil,这里的nil与oc中的有所区别,但基本概念都是空值但是...

Swift基础1.2——基本语法—Optional 可选项

Optional 是 Swift 的一大特色,定义变量时,如果指定是可选的,表示该变量可以有一个指定类型的值,也可以是 nil;定义变量时,在类型后面添加一个 ?,表示该变量是可选的;变量可选项的默认...

004--swift基础语法(Optional 可选项)

/** 定义可选项使用? 解包使用! 准备计算 */ ---- 1. 原始可选项定义 ---- none 没有值,或者 some 某一类值 le...

SVN文件上感叹号、加号、问号等图标的原因

黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:随手记Swift基础和Optional Type(问号?和感叹号!)
举报原因:
原因补充:

(最多只允许输入30个字)