距离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
}

此时再看剩下的代码:

再结合官方文档的描写叙述,能够得到例如以下几点结论:

  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(问号?和感叹号!)的更多相关文章

  1. swift:Optional Type 、Swift和Objective-C混编的讲解

    ❤️❤️❤️swift中的Optional Type的?和!含义:其实就是一个装包和拆包的过程 optional的含义: Optional事实上是一个枚举类型,Optional包含None和Some两 ...

  2. Swift基础语法(常量变量、数据类型、元组、可选、断言)

    本文来自Swift中文开发组,感谢翻译者的分享. 本文将分几部分对Swift对ios的语法做讲解.本文为第一节,主要讲解基础语法. 常量和变量 常量和变量把一个名字(比如maximumNumberOf ...

  3. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  4. Swift 可选值(Optional Values)介绍

    Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...

  5. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  6. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  7. swift基础知识学习

    用let来声明常量,用var来声明变量   声明变量: var x = 0.0, y = 0.0, z = 0.0 var welcomeMessage: String 常量和变量的命名 你可以用任何 ...

  8. swift中,Optional、?与!之间的关系

    swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...

  9. Initializer for conditional binding must have Optional type, not 'String'

    今天看到问Swift问题:  Initializer for conditional binding must have Optional type, not 'String' 以前没遇到过这个问题, ...

随机推荐

  1. Mysql按数字大小排序String字段

    问题是这样的,当我们按由大到小的顺序排序一组数字的时候,它应该如此: 9800 8000 900 但如果是这些数字是以String类型存储的话,直接排序的结果会是这样: 9800 900 8000 当 ...

  2. Spring Boot修改内置Tomcat端口号

    spring Boot 内置Tomcat默认端口号为8080,在开发多个应用调试时很不方便,本文介绍了修改 Spring Boot内置Tomcat端口号的方法. 一.EmbeddedServletCo ...

  3. SQL语句操作优先级顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  4. 近期对招聘Android开发者的一些思考

    公司要招聘Android开发者,故面试了大概十来个人.由于是小公司,所以来的人大多是90后,比較年轻.90后大概二十三四岁吧,从简历上看都写了一到两年的工作经验. 也由于是小公司,所以对工作经验这些没 ...

  5. CentOS7.2安装pure-ftpd 及其配置项

    CentOS7.2安装FTP(pure-ftpd-1.0.43) 原文链接: https://www.linuxidc.com/Linux/2016-10/135971.htm [日期:2016-10 ...

  6. Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.

    目的:使用knockout提供的机制实现输入框失去焦点后的校验工作,并使用CSS绑定给未通过校验的输入框添加红色边框突出显示. 步骤: 先在htm中添加.error的css样式, 并在输入框中的dat ...

  7. 个人用户使用genymotion 模拟器

    genymotion android模拟器速度快,比较好用.对公司使用的是要收费的,但是对个人使用还是免费的,所以个人用户还可以继续使用.使用方法 1.注册账号,填写用户名.邮箱.密码.公司类型(选g ...

  8. 谈谈MySQL的WriteSet并行复制

    [历史背景] 岁月更迭中我已经从事MySQL-DBA这个工作三个年头,见证MySQL从“基本可用”,“边缘系统可以用MySQL”,“哦操!你怎么不用MySQL”; 正所谓!“一个数据库的境遇既取决于历 ...

  9. Redis复制与可扩展集群搭建【转】

    本文会讨论一下Redis的复制功能以及Redis复制机制本身的优缺点以及集群搭建问题. Redis复制流程概述 Redis的复制功能是完全建立在之前我们讨论过的基于内存快照的持久化策略基础上的,也就是 ...

  10. 给Elasticsearch 5.2.2 设置用户权限 how to setting security for elasticsearch on windows

    1. download the plugin of elasticsearch: 下载 readonlyrest-1.14.0_es5.2.2.zip 2. install readonlyrest ...