• 随手记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也给了整整一个章节,这里就不继续展开了。

    :)

  • 相关阅读:
    SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
    Spark家族:Win10系统下搭建Scala开发环境
    Linux系统:centos7下搭建Rocketmq4.3中间件,配置监控台
    Linux系统:Centos7环境搭建Redis单台和哨兵集群环境
    Linux系统:常用Linux系统管理命令总结
    Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境
    Linux系统:centos7下搭建ZooKeeper3.4中间件,常用命令总结
    SpringBoot2.0 整合 Redis集群 ,实现消息队列场景
    SpringBoot2.0 基础案例(17):自定义启动页,项目打包和指定运行环境
    SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6698590.html
Copyright © 2020-2023  润新知