输入输出
print("hello world")
常量 & 变量
let MaxNum = 100
var str = "hello world"
var name: String
name = "Daived"
var name: String = "Daived"
可以发现未写类型注解
的情况下代码是可以运行的,因为编译会自动根据初始值推导
出变量类型
数据类型
var name:String = ""
// 多行字符串,保留换行符等特殊字符
var address:String = """
City: Beijing
Area: ChaoYang
Street: HongMiao
"""
// 遍历字符串
name = "Daived"
for eve in name {
print(eve)
}
// Character类型数组生成String(String由Character组成)
var nameCaracters:[Character] = ["D","a","i","v","e","d"]
print(String(nameCharacter))
// 连接字符串
var str1 = "hello"
var str2 = " world"
// 加法运算符拼接
print(str1 + str2)
// 加法赋值运算拼接
str1 += str2
print(str1)
// 附加方法
str1.append(contentsOf: str2)
print(str1)
// 字符串插值(连接不同变量)
var name = "Daived"
var age = 10
print("\(name) is \(age) years old")
// 常用方法
// 获取Character数
var name = "Daived"
print("\(name) has \(name.count) characters")
// 判断字符串是否为空
if name.isEmpty {
print("姓名不能为空")
}
// 在32位平台上Int为Int32
// 在64位平台上Int为Int64
var num: Int
var num64: Int64
// -2,147,483,648 ~ 2,147,483,647
var num32: Int32
// 无符号
// 最小值: UInt.min
// 最大值: UInt.max
var numU: UInt
var numU32: UInt32
var numU64: UInt64
// 32位浮点数
var float32: Float
// 64位浮点数
var float64: Double
// π 保留7位小数
var π: Float = Float.pi
// π 保留15位小数
var π: Float = Double.pi
// 数值类型字面量
var num = 1_000_000
// 布尔值常用于控制流
var isLogin = true
if isLogin {
// do something
}
// 元祖在swift属于复合类型
// 声明后不可变
var LoginError = (500,"login error")
// 解构赋值
var (code,msg) = LoginError
// String
var name = "Davied"
// Int
var num = 10
// Double
var float = 3.1415
typealias Number = Int
var num: Number = 10
print(type(of: num))
// 可选类型用于处理变量值为空的情况
// 在其他语言中变量类型可能仅存在有值和无值的情况,并没有分别处理
// 通过可选类型可以设置变量是否允许为空
var name = "Davied"
// 通过Int函数将类型转换为Int可选类型也就是Int?
var num: = Int(name)
// stdin: Optional<Int>
print(type(of: num))
// 声明可选类型
var name: String?
// 打印函数不允许非可选类型未初始化值
print(name)
// 判断值是否为空
if name == nil {
// 设置默认值
// 实用空合运算符设置默认值
print(name ?? "default")
}else{
// 强制解析(值为nil时抛异常)
print(name!)
// 强制解析可以将可选类型转为非可选类型
// 还可以使用可选绑定的方式(简化判断可选类型为空)
var str1 = name!
print(type(of: str1))
}
// 可选类型绑定
// 同样可以用于常量
if var str1 = name {
print(type(of: str1))
}else{
print(name ?? "default")
}
// 强制解析,可以将可选类型转为非可选类型,并获取值
var name:String? = "Daived"
var str1:String = name!
print(type(of: str1))
// 默认为一个可选类型
var name:String! = "Daived"
// 自动解析成非可选类型(此前需要强制解析)
var str1:String = name
集合类型
// 创建空数组
var nums:[Int] = []
print(nums.count)
// 通过数组字面量创建(数组字面量默认推到为数组类型)
var nums = [1,2,3,4]
// 通过闭区间操作符创建
var nums = Array(1...3)
// 创建带默认值数组
var threeDoubles = Array(repeating: 0.0, count: 2)
print(threeDoubles)
// 通过加法运算符或者加法赋值运算符组合数组
print(nums + threeDoubles)
// 通过isEmpty方法检查数组count是否为0
print(nums.isEmpty) // false
// 添加值
nums.append(1)
// 通过下标获取值
print(nums[1])
// 通过下标设置或者获取值时,下标必须是有效的
var nums:[Int] = []
nums[nums.count] = 10 // Fatal error: Index out of range
// 遍历数组
var nums:[Int] = [1,2,3,4]
for num in nums {
print(num)
}
// 遍历并同时获取下标和值
for (index,value) in nums.enumerated {
print("index: \(index) value: \(value)")
}
// 创建特定类型的空集合
var names = Set<String>()
// 集合中插入值
names.insert("Daived")
// 置空集合
names = []
print(type(of: names)) // 此时变量类型依然为Set<String>
// 通过数组字面量创建集合
var names:Set<String> = ["Daived","Bob","James"]
print(names)
// 通过数组字面量推断Set类型
var names:Set = ["Daived","Bob"]
// 集合同样支持count和isEmpty属性
print("names Set has \(names.count) String")
print(names.isEmpty)
// 尝试删除Set元素
var names:Set = ["Daived","Bob"]
if let removedName = names.remove("Daived") {
print("\(removedName)? I'm over it.")
} else {
print("I never much cared for that.")
}
print(names) // ["Bob"]
// 判断是否包含值
var names:Set = ["Daived","Bob"]
if names.contains("Daived") {
print("Daived in names")
}
// 遍历集合
for name in names {
print(name)
}
// 排序并生成Array
var nums:Set = [3,1,2,4,5]
for num in nums.sorted(){
print(num)
}
// 集合常用操作
var nums1:Set = [1,2,3,4]
var nums2:Set = [3,4,5,6]
// 交集
print(nums1.intersection(nums2))
// 并集
print(nums1.union(nums2))
// 对称差
print(nums1.symmetricDifference(nums2))
// nums1 在 nums2 中的相对补集合
print(nums1.subtracting(nums2))
var nums1:Set = [3,4]
var nums2:Set = [3,4,5,6]
// 是否被包含集合
if nums1.isSubset(of: nums2) {
print("num2 contain num1")
}
// 判断集合是否包含另一个集合
if nums2.isSuperset(of: nums1) {
print("num2 contain num1")
}
// 判断集合是否不相交
var nums1:Set = [1,2]
var nums2:Set = [3,4,5,6]
if !nums2.isDisjoint(with: nums1){
print("num1 isDisjoint num2")
}
// 创建空字典
var userInfo:[String:String] = [:]
var userInfo:Dictionary<String,String> = [:]
// 设置Key Value
userInfo["Name"] = "Daived"
print(userInfo)
// 字典置空
userInfo = [:]
print(userInfo)
// 字典字面量创建字典
var userInfo = ["Name":"Daived","Age":"18"]
print(userInfo)
// 集合同样支持count和isEmpty属性
// ...
// 检查更新是否成功
var userInfo = ["Name":"Daived"]
if let oldValue = userInfo.updateValue("Bob",forKey:"Name") {
print("oldValue: \(oldValue)")
print("newValue: \(userInfo["Name"] ?? "Null")")
}else{
print("Name Key not found")
}
// 检查值是否存在
var userInfo = ["Name":"Daived"]
if let age = userInfo["Age"] {
print("age : \(age)")
}else{
print("not found key age")
}
// 遍历获取Key,Value
var userInfo = ["Name":"Daived","Age":"18"]
for (k,v) in userInfo {
print("\(k) : \(v)")
}
// 遍历仅获取Key
for key in userInfo.keys {
print("key \(key)")
}
// 遍历仅获取Value
for value in userInfo.values {
print("value \(value)")
}
// 使用字典的Keys或者Values创建新数组
var values = [String](userInfo.values)
print("values \(values)")
控制流
// 遍历集合类型、字符串
// ...
// 使用数字范围遍历
// 使用_可忽略接受参数
for num in 1...3 {
print("num \(num)")
}
//
运算符
var a = 10
let b = a
var (c,d) = (a,b)
// 赋值运算符不会返回值
// 所以以下流程控制语句无法编译
if a = b {
}
var a = 10
var b = 100
// 加
print(a + b)
// 减
print(a - b)
// 乘
print(a * b)
// 除
print(a / b)
// 余
print(b % a)
// ...
// 传统形式判断
if question {
// answer1
}else {
// answer2
}
// 可简化成以下三元表达式
print(question ? answer1 : answer2)
// 判空并进行强制解包
var name: Strint?
if name != nil {
doSomething(name)
}else {
doSomething("default value")
}
// 使用三元表达式简化
name != nil ? doSomething(name) : doSomething("default value")
// 使用空合运算符简化(并返回非可选类型)
doSomething(name ?? "default value")
// 仅接收非空
func doSomething(name: String) {
print(name)
}
错误
// 定义错误枚举
enum RequestError: Error {
case BadGateway // 错误的网关
case NoAuth // 没有授权
case Paramter // 参数错误
}
// 创建函数抛出错误
func doSomething() throws {
throw RequestError.Paramter
}
// 捕获错误
do {
// 尝试执行函数,并抛出错误
try doSomething()
// 捕获错误
} catch RequestError.Paramter {
print("异常: 参数错误")
}
/ 查询Ω