zoukankan      html  css  js  c++  java
  • Swift初探01 变量与控制流

    Swift初探01 变量与控制流

    输出"hello world"是几乎学习所有编程语言的第一课,这是程序员的情怀。

    所以我们学习swift的第一步,就是输出一句"Hello, world"

    print("Hello, world!")
    

    在swift里,我们不需要C语言的main函数,也不需要和Java一样,上来就需要写一个class和一个main,我们甚至不需要为了输入输出或者字符串处理导入一个单独的库。

    在全局作用域中的代码会被自动当作程序的入口点。

    01 简单值

    • let来声明常量
    • var来声明变量

    和其他语言一样,常量必须且只能赋值一次,并且必须在声明的时候进行赋值。

    var variable = 250
    variable = 99
    let constant = 32
    

    虽然我们在写的时候没有声明变量的类型,但是并不意味着swift就是一门弱类型语言,swift是强类型的。

    swift有一个自动推断机制,在你通过一个值来声明一个常量或者变量的时候,编译器会自动推断类型。并且在之后的赋值修改中,不可以直接的换成另一个数据类型!

    比如上面的声明中,swift通过var variable = 250已经推断出该变量是整型。

    其实真正的声明是这样的:

    var variable: String = "hello swift"
    let constant: Double = 12
    type(of: variable) // String.Type
    type(of: constant) // Double.Type
    

    swift中,值永远不会被隐式转换为其他类型。如果需要把一个值转换成其他类型,请显式转换。

    例如:String(variable)即可将variable变量转化为字符串类型。

    或者使用:let apple: String = "(variable)"。(这种写法个人比较推荐)

    我们还可以使用三引号""" """来包裹一个多行的字符串内容:

    let apple = 666
    let quotation = """
        徐航宇
    真的"(apples)"
    """
    

    这里官方文档写的是:每行行首的缩进会被去除,直到和结尾引号的缩进相匹配。

    其实我个人没太看懂,因为每行行首的缩进是真实存在的,在输出时也是存在的。

    数组和字典可以使用方括号 [] 来创建,并使用下标或者键(key)来访问元素(最后一个元素后面允许有个逗号):

    var shoppingList = ["可乐", "薯片", "炸鸡"]
    shoppingList[1] = "农夫山泉"
    
    var occupations = [
        "徐航宇": "武汉",
        "刘好": "山西",
    ]
    occupations["aha"] = "ala"
    

    这里注意,字典类型是可以直接通过[key]来添加元素的,但是数组是不可以直接这样添加的,必须使用append()或者其他方法来添加:

    shoppingList.append("百岁山")
    print(shoppingList) // 数组在添加元素时会自动变大
    

    使用初始化语法来创建一个空数组或者空字典:

    let emptyArray = [String]()
    let emptyDictionary = [String: Float]()
    

    同样可以使用类型推断来创建空数组和空字典:

    shoppingList = []
    occupations = [:]
    

    好像不可以通过类型推断创建空的变量:

    var a // 报错
    var b: Int // 不报错
    

    02 控制流

    • 使用 ifswitch 来进行条件操作
    • 使用 for-inwhilerepeat-while 来进行循环迭代

    包裹条件和循环变量的括号可以省略(建议保留,增强可读性),但是语句体的大括号是必须的:

    let individualScores = [75, 43, 103, 87, 12]
    var teamScore = 0
    for score in individualScores {
        if score > 50 {
            teamScore += 3
        } else {
            teamScore += 1
        }
    }
    print(teamScore)
    

    if 语句中,条件必须是一个布尔表达式,如果是一个别的数值,就像刚刚提到过的——swift不会自己做隐形转换,该值不会隐形地与 0 做对比得出一个布尔值(但是会得到一个报错)。

    这个时候如果我们这样来写:

    var optionalName: String? = "徐航宇"
    var greeting = "Hello!"
    if let name = optionalName {
      greeting = "Hello, (name)"
    }
    print(greeting)
    

    这里if+let有什么用呢?

    这个?表述的是可选类型,也就是说,可以同时值为nil和制定类型的变量类型。

    如果这个地方optionalName不是nil,那么就会将值赋给前面let的常量name,并且可以继续执行大括号中的代码;如果他是nil,那么这个位置会被判定为false,什么也不操作,并且跳过大括号中的代码。

    合并空值运算符也是可以处理nil值一种方法:

    let nickName: String? = nil
    let fullName: String = "John Appleseed"
    let informalGreeting = "Hi (nickName ?? fullName)"
    

    如果??前的值是nil,那么会取后面的值;如果不是nil,那么将会取他自己的值。也就是后面的值相当于默认值。

    这里最后在谈一下可选类型。

    首先,如何使用可选类型?

    • var a:Int? = 10 // print结果为:Optional(10)
    • 若输入var a:Int = nil或是var a = nil // 会报错。
    • var a:Int? = nil // print结果为:nil

    可以看到,可选类型一般用于处理值缺失的情况。

    若变量在运算或者输出时有合适的值,则输出值;若没有合适的值,则输出? =后的值。

    那么如何取出Optional的值?

    使用 ! 可以取出真实值:

    var a:Int? = nill
    
    a = 10
    print(a) // Optional(10)
    print(a!) // 10
    
    var b:Int? = nil
    print(b!) // 报错
    

    隐式展开

    如果直接确定了该变量必然有值,可以用 ! 代替 ? 。

    var a:Int! = 5
    
    print(a) // 输出5,而不是Optional(5)
    

    记住,nil也是一种值。

    var a:String? = "hello world"
    
    if(a == nil){
    	print("nil也是一种值")
    } else {
      print("a的值为空,此时使用" + a + "来替代") // 报错
      print("a的值为空,此时使用" + a! + "来替代") // hello world
    }
    

    注意:a的值为可选类型Optional("hello world"),需要使用 ! 取出真实值。

    当我们使a = nil时,发现输出nil也是一种值;当我们什么也不写时,输出a的值为空,此时使用hello world来替代

    关于可选类型绑定

    可以使用以下方法快捷赋值:

    var a:Int? = nil
    
    if let value = a{ // 也可以用var
    
    	print(value)
    
    } else {
    
    	print("value没被赋值")
    
    }
    

    PS: value的作用域只在 if{} 之中。

  • 相关阅读:
    windows AD监听的端口
    [FreeBSD] 双网卡绑定
    Kea DHCP MySQL
    NTP服务器知识整理
    linux的常用命令
    配置squid集成域身份认证
    Windows上配置PHP的LDAP扩展
    PHP下使用ldap域账户认证密码
    理解syslinux,SYSLINUX和PXELINUX
    优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr
  • 原文地址:https://www.cnblogs.com/xhyccc/p/12722890.html
Copyright © 2011-2022 走看看