zoukankan      html  css  js  c++  java
  • 随手记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也有掠过)。

    依据这一小节开头的两行演示样例代码。我们能够得知有一种新类型是在既有类型后面加问号?:


    这样的类型叫做“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也给了整整一个章节,这里就不继续展开了。

    :)

  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6698590.html
Copyright © 2011-2022 走看看