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{} 之中。

Swift初探01 变量与控制流的更多相关文章

  1. 李洪强iOS开发Swift篇---11_变量&常量&元组

    李洪强iOS开发Swift篇---11_变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对 ...

  2. Swift常量和变量以及命名规范

    我们在上一章中介绍了如何使用Swift编写一个HelloWorld小程序,其中就用到了变量.常量和变量是构成表达式的重要组成部分.常量在声明和初始化变量时,在标识符的前面加上关键字let,就可以把该变 ...

  3. 李洪强iOS开发Swift篇—02_变量和常量

    李洪强iOS开发Swift篇—02_变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3. ...

  4. 转战JS(1) 初探与变量类型、运算符、常用函数与转换

    转战JS(1)初探与变量类型.运算符.常用函数与转换 做为一名.NET后台开发人员,正考滤向Web前端开发转型,之前也写过一代前端代码,可是当再回头看JS,并有转向它的意愿的时候,突然发现:原来JS不 ...

  5. Java基础语法01——变量与运算符

    本文是对Java基础语法的第一部分的学习,包括注释:标识符的命名规则与规范:变量的数据类型分类以及转换:以及六种运算符(算术.赋值.比较.逻辑.三元和位运算符).

  6. ios swift 里面关于变量 常量 可选类型 控制流的一些心得

    //swift 里面没有头文件和实现文件.只有一个.swift文件 //swift 里面没有main的概念,程序从main.swift开始执行 //swift 每一条执行语句可以不用分号结束,多条语句 ...

  7. swift:入门知识之控制流

    1.swift语句中的控制流和其他语言大致相同,使用if和switch作为条件控制.使用 for-in.for.while.do-while作为循环. 2.区别之处:小括号不是必须的,但是主体的大括号 ...

  8. Swift初探02 数组、集合、元组、字典

    数组.集合.元组.字典 每一门语言基本都会有这些数据结构,swift也不例外,而作为一门现代的语言,swift提供了很多的现成的方法给我们选择. 一.数组 01 数组的定义 // 三种声明方式 var ...

  9. Swift学习--常量.变量.数据类型的使用(二)

    一.Swift中的数组 //Swift中的数组 //NSArray *arr = @["",""]; //和OC数组的区别就是去掉前面的@ let arr11 ...

随机推荐

  1. C++ - free()函数释放内存后的指针行为

    一个指针释放后不置空的后果: free(p)之后原本那块内存的数据已经被释放了,内存重新收回.但此时的指针变量依然指向那块内存,在以后的代码中若不小心继续调用指针变量,会出现不可预料的错误. 不置空的 ...

  2. vulnhub 靶机 Kioptrix Level 1渗透笔记

    靶机下载地址:https://www.vulnhub.com/entry/kioptrix-level-1-1,22/ kali ip 信息收集 先使用nmap收集目标的ip地址 nmap -sP 1 ...

  3. mian中的argv调用时为什么不是*argv

    c++main函数char * argv[]是个指针数组,元素是指针,为何argv[1]得到不是地址? 照我的理解char *argv[]保存的应该是一组指针,即地址,每个地址中保存的是char类型变 ...

  4. 以太网在汽车行业中的挑战——灵活的接口及软件使ECU开发不再复杂

    以太网在汽车行业中的挑战--灵活的接口及软件使ECU开发不再复杂 以太网将会在一批新车型中作为一个车载系统网络使用.因此,下一步就是以太网和现有汽车网络技术的集成,包括:CAN.FlexRay.LIN ...

  5. css流程图、步骤图,流程线与环节分别实现,支持单环节、多环节情况。scss生成CSS

    适用于分步骤操作的页面导航图 实现结果如下 上图对应下述代码,稍作修改可以生成下图.css代码如下: @charset "UTF-8"; /**单列宽度 单行高度 列数 行数*/ ...

  6. 如何形成一个完整的HTML对象

    写在前面,本文将同步发布于Blog.掘金.segmentfault.知乎等处,如果本文对你有帮助,记得为我得到我的个人技术博客项目给个star哦. 为何写这篇文章? 你可能做Web开发已经有一段时间, ...

  7. Python:爬取全国各省疫情数据并在地图显示

    代码: import requests import pymysql import json from pyecharts import options as opts from pyecharts. ...

  8. 在vue中实现点击哪个哪个区域变化背景色和字体颜色,其他默认(uni-app框架中也可以使用)

    template: 1 <view class="wrap"> 2 <view class="total" :class="{ se ...

  9. Struts2-使用forEach标签+el标签获取值栈数据

    import cn.web.body.User; import com.opensymphony.xwork2.ActionSupport; import java.util.ArrayList; i ...

  10. centos7 安装樱桃树cherrytree

    樱桃树对于做笔记或者编程来说都是很好的工具.以前再网上找了很久还是稿不懂cherrytree的方法.后来才发现,其实根本就不用那么麻烦.直接在epel源里面安装句可以了. 下面说下安装步骤: 第一步: ...