随手记Swift基础和Optional Type(问号?和感叹号!)
2014-06-10 16:43
337 查看
http://blog.csdn.net/jasonblog/article/details/28876823
距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序员,要求有一天工作经验”的帖子。
看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕。
这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论。
关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发者不算是很大的冲击,毕竟写代码这门功夫,比较注重内功修炼。而对于功能越强大越灵活的语言,有可能高手拉开的距离更大,比如我很久以前转载的一篇如何消除Python列表中的重复元素。
初步看下来,觉得Swift有点像JavaScript,又有点Python的风格,再看还有C++的特性。总的下来,有点“杂糅”或“博采众长”的味道,以下是一些基础代码示例:
为了体现playground的效果,我在这里上传了截图,而不是直接贴代码。说到这个,可见从某种角度来看,大家都在同一起跑线上,毕竟连怎么看日志输出都可以在SO上收获很多reputation,哈哈。
上面的代码我只截取了部分,还有部分如下:
[cpp] view
plaincopy
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也有掠过)。
根据这一小节开头的两行示例代码,我们可以得知有一种新类型是在既有类型后面加问号?:
这种类型叫做“Optional Type”。参考Swift的类型声明,我们尝试声明Optional类型看看:
[cpp] view
plaincopy
var oVar: Optional
编译器会报错:
[cpp] view
plaincopy
Playground execution failed: error: <REPL>:46:11: error: reference to generic type 'Optional' requires arguments in <...>
var oVar: Optional
^
generic type 'Optional' declared here
根据错误提示,我们可以得知这是个泛型类型,需要指定具体的类型:
[cpp] view
plaincopy
var oVar: Optional<Int>
于是我们可以跳进去查看Optional的具体定义:
[cpp] view
plaincopy
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也给了整整一个章节,这里就不继续展开了。
:)
距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序员,要求有一天工作经验”的帖子。
看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕。
这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论。
关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发者不算是很大的冲击,毕竟写代码这门功夫,比较注重内功修炼。而对于功能越强大越灵活的语言,有可能高手拉开的距离更大,比如我很久以前转载的一篇如何消除Python列表中的重复元素。
初步看下来,觉得Swift有点像JavaScript,又有点Python的风格,再看还有C++的特性。总的下来,有点“杂糅”或“博采众长”的味道,以下是一些基础代码示例:
为了体现playground的效果,我在这里上传了截图,而不是直接贴代码。说到这个,可见从某种角度来看,大家都在同一起跑线上,毕竟连怎么看日志输出都可以在SO上收获很多reputation,哈哈。
上面的代码我只截取了部分,还有部分如下:
[cpp] view
plaincopy
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也有掠过)。
根据这一小节开头的两行示例代码,我们可以得知有一种新类型是在既有类型后面加问号?:
这种类型叫做“Optional Type”。参考Swift的类型声明,我们尝试声明Optional类型看看:
[cpp] view
plaincopy
var oVar: Optional
编译器会报错:
[cpp] view
plaincopy
Playground execution failed: error: <REPL>:46:11: error: reference to generic type 'Optional' requires arguments in <...>
var oVar: Optional
^
generic type 'Optional' declared here
根据错误提示,我们可以得知这是个泛型类型,需要指定具体的类型:
[cpp] view
plaincopy
var oVar: Optional<Int>
于是我们可以跳进去查看Optional的具体定义:
[cpp] view
plaincopy
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基础和Optional Type(问号?和感叹号!)
- Swift语言中问号 ? 和 感叹号 ! 的作用
- Swift中的问号?和感叹号!
- swift中问号?和感叹号!
- [Swift A]-问号&感叹号
- swift 中的问号跟感叹号
- Swift中的问号?和感叹号!
- Swift语言中问号 ? 和 感叹号 ! 的作用
- Swift中的问号?和感叹号!
- Swift中的问号?和感叹号!
- swift 中的 感叹号 问号 和 双问号用法详解
- Swift中的问号?和感叹号!
- Swift中的问号和感叹号详解
- Swift中的问号?和感叹号!
- Swift3.0- swift中的问号"?"和感叹号"!"语法
- Swift 总结使用问号(?)和感叹号(!)-备用
- Swift Optional Type(问号?和感叹号!)的理解和使用
- Swift可选值OptionalOptional 问号 感叹号