Swift5.0基础

温馨提示:本文记录的知识点兼容Swift5.0

在 Swift 语言当中,一行代码就是一个完整的程序。
不用编写main函数,Swift将全局范围内的首句可执行代码作为程序入口。

一句代码尾部可以省略分号(;)
多句代码写到同一行时必须用分号(;)隔开。

打印

var badg = 12;  
var number = 22;        
// 使用  \(xxxx)进行插值
print("I am:\(number) He is: \(badg)")
print("I am :", badg, "you are:", number )

使用 let来声明一个常量。不需要修改的,尽量定义成let
使用var来声明一个变量。
值不要求在编译时期确定,但使用之前必须赋值1次。

常用数据类型:

Bool、Float、Double、String、Character
Array、Dictionary、Set
枚举类型Operation

  • 字符串

Swift 的 String 和 Character 类型是完全兼容 Unicode 标准的。 Unicode是一个用于在不同书写系统中对文本进行编码、表示和处理的国际标准。它使你可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。

// 字符串的长度
let lentgh = string0.count
// 使用 + ,字符串拼接
var str0 = "I Love" + "You"
// 使用 == 进行字符串的比较
if str1 == str2 {
  
}
// 判断字符串是否为空
if str0.isEmpty {
  
}
// 遍历每一个字符
for cha in String0 {
    print(cha)
}
// 字符串转 数字
let numString = "123"
let num = Int(numString)   // num 被推测为类型 "Int?", 或者类型 "optional Int"
  • 数组
let array = [1,2,3,4,5,6,7,8,9]
let num0 = array[0]  // 或 array.first
// 声明数组属性
var datalist : [string] = []
var someInts = [Int]()
var arr0 : Array<Int> = Array()
// 重复元素的数组
var threeDoubles = Array(repeating: 0.0, count: 3)
// 遍历数组
for num in arr0 {
    print(num)
}
// 判断数组是否为空
if arr0.isEmpty {
   //...
}
// 是否包含某元素
if arr.contains("x") {
}
// 添加 删除元素
arr0.append("2")   //在数组的末尾添加
arr0.append(contentsOf: ["3","4"])
arr0.insert("2", at: 1)
arr0.insert(contentsOf: ["3","4"], at: 0)
arr0.remove(at: 2)

// 数组可以相加(元素类型需一致)
var arr3 = arr1 + arr2

  • 字典
    字典是一种无序的集合,它存储的是键值对之间的关系,其所有键的值需要是相同的类型,所有值的类型也需要相同。一个字典的 Key 类型必须遵循 Hashable 协议
// [Key: Value]形式 定义 确定类型的 字典
var dic = [Int: String]()

let dic = [:]   // 空字典
let dict = ["age":18, "height":100, "width":200]
// 键值类型 确定
var dic: [String: String] = ["YYZ": "Toronto", "DUB": "Dublin"]

// 键值对 个数
dic.count
// 字典是否为空
if dic.isEmpty {
}
// 更改
let dic1 = dic0.updateValue("Dublin", forKey: "DUB")
// 删除
dic["APL"] = nil
let dic1 = dic0.removeValue(forKey: "DUB")
// removeValue方法 在键值对存在的情况下,会移除该键值对并返回被移除的值;
// 在没有对应值的情况下,返回 nil:

// 遍历
for (key, value) in dic {
    print("\(key): \(value)")
}
// 抽离 键值
let arr1 = [String](dic0.keys)  // 返回数组
let arr2 = [String](dic0.values)

// 排序
dic.keys.sorted()

元组(tuples)

把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

// 定义元组,通过.0 或 .1来访问内部属性
let http404Error = (404,"网页不存在")
print(http404Error.0, http404Error.1)

// 定义元组,分别给元组内参数赋值,通过参数进行访问
let (statusCode, errorString) = (404,"网页不存在")
print(statusCode, errorString)

// 使用_,表示不赋值
let (statusCode1, _) = (404,"网页不存在")
print(statusCode1)

// 通过元组内部参数进行访问
let http200Status = (statusCode:200, statusString:"请求成功")
print(http200Status.statusCode, http200Status.statusString)

按照Swift标准库的定义,Void就是空元组`()

流程控制语句

var number = 22
if number == 0 {
  print("ok!")
}else{

} 

guard let location = "xxx" else {
// 如果条件不为真,  则执行 else 从句中的代码。        
}

while number<3 {
  print("ok!")  
}

repeat {
  print("ok!")  
}while number<3

// for-in循环
let arr = ["Anna", "Alex", "Brian", "Jack"]
for name in arr {
    print("Hello, \(name)!")
}
let dic = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in dic {
// 字典的内容理论上是无序的,遍历元素时的顺序是无法确定的
    print("\(animalName)s have \(legCount) legs")
}

区间运算

闭区间[a,b]的表示:a...b
半开区间[a,b)的表示:a..<b
单侧区间[a,∞)的表示a...

区间类型ClosedRange、Range、PartialRangeThrough

let rang1: ClosedRange<Int> = 1...3;
let rang2: Range<Int> = 1..<3
let rang3: PartialRangeThrough<Int> = ...3

带间隔的区间
[0,2,4,6...100]的表示stride(from: 0, to: 100, by: 2)

for-in循环

//默认num是let 类型,可以省略
for num in 1...10{
    print(num)
}

//如果要修改 num 的值,需要更改为var类型
for var num in 1...10 {
    num += 100
    print(num)
}
//不需要用到 num ,可以使用_缺省
for _ in 1...10 {
    print("hello,world")
}

设置间隔的函数:stride(from:to:by:)
for tickMark in stride(from: 0, to: 60, by: 5) {
    // 每5分钟渲染一个刻度线(0, 5, 10, 15 ... 45, 50, 55)
}

continue语句,使本次循环结束,重新开始下次循环。
break 语句会 立刻结束整个控制流的执行。

区间运算与数组

let arr2 = ["aaa", "bbb", "ccc", "ddd"]
for str in arr2[1...2] {
    print(str)    //打印了bbb和ccc
}

switch语句

case、default后面不能写{}
case之后不必接break
每一个case必须包含至少一条语句
case允许同时判断多个条件
支持Character、String类型
使用fallthrough可以实现贯穿效果

let name = "c"
switch name {
case "c", "d":   // 可以合并多个条件
    print("ok")
case "a":
    print("ok")
default:
    break
}

可配合区间、元组

let num = 12
switch num {
case 1...10:
    print("ok")
case 11...20:
    break
default:
    break
}
let point = (1, 1)
switch point {
case (0, 0):
    print("the origin")
case (_, 0):
    print("on the x")
case (0, _):
    print("on the y")
case (-2...2, -2...2):
    print("inside box")
default:
    print("outside box")
}

值绑定:如果有一个值相同,另外一个则会自动绑定

let point1 = (1, 1)
switch point1 {
case (let x, 0):
// 将匹配一个y为 0 的点,并把这个点的横坐标赋给临时常量 x;
// 临时常量可在该case分支 里使用
    print("在x轴")
case (0, let y):
    print("在y轴")
case (let x, 1):
    print("在x轴") 
default:
    print("outside of the box")
}

where关键字

用于判断某个条件满足,才会执行。

  • 区间与where
    [10,20,30...100]表示为1...100 where num % 10 == 0
for num in 1...100 where num % 10 == 0 {
    print(num)
}
  • 元组与where
    ??
let point2 = (1, 2) 
// 判断point2的两个元素是否相等
switch point2 {
case let (x, y) where x == y:
    print("ok")
case let (x, y) where x != y:
    print("no")
default:
    break
}

关键字 typealias
typealias用来给类型 起别名

typealias Byte  = Int8
typealias Short = Int16
typealias Long  = Int64

typealias Date = (year: Int, month: Int, day: Int)
func test(_ date: Date) {
    print(date.0)
    print(date.year)
}
test((2011, 9, 10))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345