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. 自动驾驶运动规划-Reeds Shepp曲线

    自动驾驶运动规划-Reeds Shepp曲线 相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动. Reeds Shepp Car运动规 ...

  2. 开源HTML5游戏引擎Kiwi.js 1.0正式发布

    Kiwi.js是由GameLab开发的一款全新的开源HTML5 JavaScript游戏引擎.在经过一年多的开发和测试之后,终于在日前正式发布了Kiwi.js 1.0版本. 其创始人Dan Milwa ...

  3. 小记-用canvas完成图像液化(向前变形)过程

    前几天由于团队需要,折腾了一下图像液化的处理过程. 现在来整理一下思路,做个记录. 用到公式如下,网上拿来的 话不多说,上代码 本来想尽量写出点逼格...后来发现怎么写也还是几个function搞定, ...

  4. 用纯CSS实现优雅的tab页

    说明 又是一个练手的小玩意儿,本身没什么技术含量,就是几个不常用的CSS3特性的结合而已. 要点 Label标签的for属性 单选框的:checked伪类 CSS的加号[+]选择器 效果图 原理 通常 ...

  5. 【Android开发】用WebView访问证书有问题的SSL网页

    Android系统的碎片化很严重,并且手机日期不正确.手机根证书异常.com.google.android.webview BUG等各种原因,都会导致WebViewClient无法访问HTTPS站点. ...

  6. 【Android开发】【布局】 仿微信UI

    Demo地址

  7. Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 报错及解决办法

    亲测Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 解决办法 - 程序员大本营 ...

  8. SpringBoot 项目搭建(详细介绍+案例源码)

    SpringBoot 项目搭建 SpringBoot 项目整合源码 SpringBoot 项目整合 一.项目准备 1.1 快速创建 SpringBoot 项目 1.2 标准项目结构图如下 1.3 添加 ...

  9. Java中的反射以及简单运用(原理+例子)

    Java反射 学习内容 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 字节码对象理解 5. 获取字节码对象(.class)的三种方式 6. 反射常用API 8. 反射综合 ...

  10. SpringBoot其他框架-JPA-Hibernate-Swagger

    SpringBoot其他框架 通过了解其他的SpringBoot框架,我们就可以在我们自己的Web服务器上实现更多更高级的功能. 邮件发送:Mail 我们在注册很多的网站时,都会遇到邮件或是手机号验证 ...