TypeScript老手的Swift入门之路:初识Swift 基础类型对比

965 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 类型申明

语言变量常量定义类型类型推导
Tavascriptvar、letconstvar a:string = ""const a = ["Damo"]
Swiftvarletvar a:String = ""let a = ["Damo"]

在js/ts中,varlet 代表的是变量,可以重新赋值,而swift则使用var指代变量。而let则与const 对应,这里需要好好理解一下,难免会和js的语法混淆。

Swift中的变量申明可以使用几乎任意的Unicode字符,比如:

let π = 3.14

let 你好 = "你好"

let 🐷 = "pig"

当然,除了空白符号、数字开头、箭头、数学符号(+ -)、线框符号等等超过一半意义的内容是不合法的,对于这些学习编程的人应该都清楚。

2. 几种数据类型

1. boolean 布尔值

它们的值正好都是 false|true,避免有些类型是FalseTrue的尴尬,在这里我就不点名是C#了。但是对于基础类型而言,Swift的基础类型是Bool,而TS则是Boolean|boolean

swift中布尔值取反可以用 !,也可以用toggle() 函数:

var isOpen = false

isOpen.toggle() // 等价于。isOpen = !isOpen

不得不说,如果变量很长的情况下,函数会更好用一些

2. number 数值

  1. 整型

和所有的强类型语言一样,Swift提供了8(UInt8)、16(UInt16)、32(Int32)、64(Int64)位有符号、无符号整数以及特殊整形Int,在32位机器下等于Int32,64位机器下等于Int64。

而js只提供了简单的有符号整形和大整数(1n)

  1. 浮点型 Swift提供了两种类型,Double(64位浮点数)、Float(32位浮点数),而ts下只有统一的Number(64位浮点数),采用IEEE754表示法。

  2. 数字文字

无论是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 元组

语言语法结构
Tavascriptlet tuple:[string,number] = ["File Not Found",404]let [ msg,code ] = tuple
Swiftlet 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 ,我的理念是:尊于思想,行于手掌,希望与您交流共同进步。