输入输出
print("hello world")
常量 & 变量
let MaxNum = 100
var str = "hello world"
var name: Stringname = "Daived"
var name: String = "Daived"
可以发现未写类型注解的情况下代码是可以运行的,因为编译会自动根据初始值推导出变量类型
数据类型
var name:String = ""// 多行字符串,保留换行符等特殊字符var address:String = """City: BeijingArea: ChaoYangStreet: 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 += str2print(str1)// 附加方法str1.append(contentsOf: str2)print(str1)// 字符串插值(连接不同变量)var name = "Daived"var age = 10print("\(name) is \(age) years old")// 常用方法// 获取Character数var name = "Daived"print("\(name) has \(name.count) characters")// 判断字符串是否为空if name.isEmpty {print("姓名不能为空")}
// 在32位平台上Int为Int32// 在64位平台上Int为Int64var num: Intvar num64: Int64// -2,147,483,648 ~ 2,147,483,647var num32: Int32// 无符号// 最小值: UInt.min// 最大值: UInt.maxvar numU: UIntvar numU32: UInt32var 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 = trueif isLogin {// do something}
// 元祖在swift属于复合类型// 声明后不可变var LoginError = (500,"login error")// 解构赋值var (code,msg) = LoginError
// Stringvar name = "Davied"// Intvar num = 10// Doublevar float = 3.1415
typealias Number = Intvar num: Number = 10print(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是否为0print(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)}// 排序并生成Arrayvar 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 ValueuserInfo["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,Valuevar userInfo = ["Name":"Daived","Age":"18"]for (k,v) in userInfo {print("\(k) : \(v)")}// 遍历仅获取Keyfor key in userInfo.keys {print("key \(key)")}// 遍历仅获取Valuefor 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 = 10let b = avar (c,d) = (a,b)// 赋值运算符不会返回值// 所以以下流程控制语句无法编译if a = b {}
var a = 10var 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("异常: 参数错误")}
/ 查询Ω
