Swift应用于iOS macOS 和watchOS TVOS
敏捷 灵巧而不失简洁
swift与java JavaScript c#等语法相似
- 二 swift操作符号
swift 加法操作符
数学操作符
对浮点数求余
操作符有一元操作符 二元操作符 三元操作符
赋值运算符
a = b 意为用b的值来初始化或更新a的值。
元组型变量可以一次给多个变量赋值
var (d, e, f) = (3, 4, 5)
swift求% 支持整数和符点数
取负和取正 - +
数学操作符 + -
组合赋值操作符
var x = 15
比较操作符
>= <=
区间操作符
闭区间 a...b
半开区间a..<b
逻辑操作符
用于修改或组合布尔值 & |
- 三 字符串和字符
字符串是一个有序的字符集,
swift中用String来表示字符串类型 ,他是character集合
字符串子面量 双引号“”的值称为子面量
let a = ""
可以用Character类型来定义字符串.
let a : Character = "A"
可以对一个字符串的characters属性进行循环,来访问其中单个字符
for x in c.characters {
print(x)
}
连接字符串和字符 用+符号
var d: Character = "!"
c.append(d)
字符串插值:组合常量/变量/字面量/表达式成一个长字符串
let 订票提示 = "旅客\(name)先生, 您在\(time)订购了\(车类型)\(车次),单程票价是\(票价)元的往返.一共需要支付\(票价 * 2)元."
Unicode: 一种国际化文字编码标准. 几乎可以兼容所有语言的文字和书写系统.除了可以直接打出Unicode字符,还可以使用数字化的量,叫Unicode标量.\u{1F425} 汉字Unicode一览
字符计数: 使用字符串characters属性的count属性来获取字符个数.
修改字符串. 通过字符串的各种方法和属性,其中一种方法是使用索引.
首字符索引 startIndex, endIndex是尾字符后一个位置.
a.startIndex
a.endIndex
字符串和字符相等性:用 == 或 != 操作符. Unicode扩展语素组合而成的字符与正式的单个字符被视为相等.
一个类/结构体/枚举关联的值. 分为实例属性和类型属性
懒加载属性: 用于延后载入一个资源消耗大户(大文件/图像/视频/网络操作等).
class 地图 {
var filename = "死亡沙漠.map"
}
class 战士: 角色 {
lazy var 打怪地图 = 地图()
var 进入副本 = false
}
🐬计算属性:由其他属性计算得出的. 由getter和setter组成.
getter⏳获取器(必须):描述属性如何计算及返回语句,形式: get { 语句和返回 }
setter🔨设置器(可选):有新值(newValue)后如何影响其他属性.形式: set { 语句 }.
🌰游戏人物的坐标,移动后的坐标.
var 人物坐标 = 坐标()
var 人物移动方式 = 移动方式.走
var 当前坐标: 坐标 {
get {
switch 人物移动方式 {
case .走:
人物坐标.x += 1
人物坐标.y += 1
case .跑:
人物坐标.x += 3
人物坐标.y += 3
case .骑:
人物坐标.x += 10
人物坐标.y += 10
case .传送:
人物坐标.x += 1000
人物坐标.y += 1000
}
return 人物坐标
}
set {
人物坐标 = newValue
}
}
👀属性监视器: 类似计算属性的setter,可以响应所有属性中值的变化.
willSet: 事前响应. 新值 newValue
didSet : 事后响应. 旧值 oldValue
var 总经验 : Int = 0 {
willSet {
print("当前总经验是:\(newValue)!")
}
didSet {
print("增加了\(总经验 - oldValue)点经验!")
}
}
类型属性 :属于类型本身,通用于任何实例,所以总是有默认值.
⚠️对于类, 计算型的类型属性,前面要加关键字class. 可被子类重写(override)
lass 生命体 {
class var 遗传方式 :String {
return "RNA"
}
}
class Human: 生命体 {
override class var 遗传方式: String {
return "DNA"
}
}
enum 猜拳 {
case 石头,剪刀,布
static let game = "猜拳"
mutating func 开始() {
print("我出的是\(self)")
switch self {
case 剪刀 :
self = 石头
case 石头:
self = 布
case 布:
self = 剪刀
}
}
}
结构体/枚举实例默认不可改变属性值. 若需要修改,须加上mutating关键字.
struct 角色坐标 {
var x = 0, y = 0
mutating func 安全区坐标(x: Int, y: Int) {
self.x = x
self.y = y
对于类, 加关键字class. 可被子类重写(override)
class func 服务器名() {
print("\(姓名),您在北京联通一区!")
}
class之间的“父子”关系的体现。
1⃣️子类可以继承父类的属性和方法
子类可以根据需要,修改继承来的属性和方法(多态)
一个函数可以加上throws关键字,表示可以处理错误. 这个函数的调用者可以捕获(catch)这个错误并进行应对.
func aFoo() throws {
print("iOS教学直播,房间号:57621, douyu.com/xiaobo")
}
处理更细分的错误情况,错误类型须遵从ErrorType协议。
swift中错误处理
特定的清理收尾工作。defer语句
defer {
print("Game over!")
}
任何满足协议的“需求”的类型,被称为“遵从”该协议。
struct 某个结构体: 某协议, 另一个协议 {
}
class 子类: 父类, 某协议, 另一个协议 {
}
属性协议:顾名思义,要求遵从者实现以指定的名称实现属性,但具体实现是实例属性或类型属性并不关心。
对既有的类/结构体/枚举/协议添加新功能,即使无权查看这些类型的源代码(也叫:追加建模). 扩展没有名称
类型参数紧跟函数名之后,用尖括号包含,如: <类型占位符>.
一旦定义了类型参数, 即可用作定义参数类型/函数返回类型/函数体中做类型标识.
无论何时函数被调用时, 类型参数就被实际的类型取代. 可以定义任何多类型参数, <占位符1,占位符2,..>
命名:大多数情况下, 类型参数名称望文生义即可. 比如 Dictionary<Key, Value> , Array<Element> ,描述了相互之间,或与函数的关系. 如无明显的关联, 传统上用单个的大写字母, 如T, U, V. T代表Type(类型).