持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
如果你是一名JS/TS的老手,开发了很多年的js相关的应用,并且现在想要学习一下使用Swift开发iOS程序,但是又无从下手,那这系列文章将适合你。
Swift 是2014年苹果WWDC(Worldwide Developers Conference) 开发者大会发布的一款用于macos和ios平台开发的新式语言,现在亦可以开发watchOS和tvOS的程序,可以通过A Swift Tour学习了解这门语言,也可以通过swift-book全面的掌握它。
Swift是一门强类型语言,所有的类型在使用时必须是明确定义的,不过Swift也可以完成类型推导工作,这会让code界面看起来更加美观一些。
我一直打算开发一款属于自己的iOS app,购买了mbp m1之后就跃跃欲试,最近陆陆续续跟着官方demo和其他github上面的源码对照理解,勉勉强强窥得一斑,在此正好将自己的学习历程记录下来,希望后来者可以做个参考,也让自己的记忆和理解更上一层
接下来就进入语法对比时刻:
1. TavaScript VS Swift 类型申明
| 语言 | 变量 | 常量 | 定义类型 | 类型推导 |
|---|---|---|---|---|
| Tavascript | var、let | const | var a:string = "" | const a = ["Damo"] |
| Swift | var | let | var a:String = "" | let a = ["Damo"] |
在js/ts中,var、let 代表的是变量,可以重新赋值,而swift则使用var指代变量。而let则与const 对应,这里需要好好理解一下,难免会和js的语法混淆。
Swift中的变量申明可以使用几乎任意的Unicode字符,比如:
let π = 3.14
let 你好 = "你好"
let 🐷 = "pig"
当然,除了空白符号、数字开头、箭头、数学符号(+ -)、线框符号等等超过一半意义的内容是不合法的,对于这些学习编程的人应该都清楚。
2. 几种数据类型
1. boolean 布尔值
它们的值正好都是 false|true,避免有些类型是False|True的尴尬,在这里我就不点名是C#了。但是对于基础类型而言,Swift的基础类型是Bool,而TS则是Boolean|boolean
swift中布尔值取反可以用 !,也可以用toggle() 函数:
var isOpen = false
isOpen.toggle() // 等价于。isOpen = !isOpen
不得不说,如果变量很长的情况下,函数会更好用一些
2. number 数值
- 整型
和所有的强类型语言一样,Swift提供了8(UInt8)、16(UInt16)、32(Int32)、64(Int64)位有符号、无符号整数以及特殊整形Int,在32位机器下等于Int32,64位机器下等于Int64。
而js只提供了简单的有符号整形和大整数(1n)
-
浮点型 Swift提供了两种类型,Double(64位浮点数)、Float(32位浮点数),而ts下只有统一的Number(64位浮点数),采用IEEE754表示法。
-
数字文字
无论是ts还是swift,都支持:
- 无前缀的十进制 //
22 - 带前缀的二进制
0b//0b1101 - 带前缀的八进制
0o//0o101 - 带前缀的十六进制
0x//0xff0 - 科学计数法
e//1e3 - 增强可阅读
_//123_456
此外swift还支持浮点型十六进制表示 // let hexadecimalDouble = 0xC.3p0 ,而js暂不支持
❗️:数字在转换的过程中只能由小范围向大范围类型靠拢,反之则会丢失精度并且可能最大值越界的危险。
ts中无论是整形还是浮点数都是相同类型(Number) ,因此计算中可以随意组合。但是对于强类型swift而言,整型和浮点型的计算必须保持一致,通常我们会将整型转为(Double(15))浮点型再运算
3. tuple 元组
| 语言 | 语法 | 结构 |
|---|---|---|
| Tavascript | let tuple:[string,number] = ["File Not Found",404] | let [ msg,code ] = tuple |
| Swift | let tuple = ("File Not Found",404) | let (msg,code) = tuple |
ts中借助于数组的语法做元组,而swift支持元组,包括python、c#等现代语言都支持元组的概念。
具名元组
swift可以给元组的元素取名,比如:
let http200Status = (statusCode: 200, description: "OK")
// http200Status.statusCode
但是ts目前不能支持。
4. 空值 nil vs null
ts的undefined并不属于空值,但是因为历史原因,一直保留空的属性,真正的空值应该是null。对于ts而言,表示一个变量可为空,需要使用联合类型 string|null 来定义。
let activeName : string|null = null;
swift可以使用可选项 类型?(隐式解包),而为空时的类型为nil
var activeName : String? = nil;
而如果要赋值给一个确定的String类型,需要使用(!)强制解包
var myActiveName : String = activeName!
不过在ts的class中可以使用?:来申明一个可能存在的属性,使用 !:申明确定存在的值。
class Person {
name ?: string
age!:number
address?:{ region:string,area:string }
}
在ts中也存在类似解包的概念——断言
var person = new Person()
person.address?.region
person.address!.region
好了,以上就是今天的结论,更多的类型将在后面展示!
👋 Hi, Here is @blllld ,我的理念是:尊于思想,行于手掌,希望与您交流共同进步。