参考:README - SwiftGG

输入输出


  1. print("hello world")

常量 & 变量


  1. let MaxNum = 100
  1. var str = "hello world"
  1. var name: String
  2. name = "Daived"
  1. var name: String = "Daived"

可以发现未写类型注解的情况下代码是可以运行的,因为编译会自动根据初始值推导出变量类型

数据类型


  1. var name:String = ""
  2. // 多行字符串,保留换行符等特殊字符
  3. var address:String = """
  4. City: Beijing
  5. Area: ChaoYang
  6. Street: HongMiao
  7. """
  8. // 遍历字符串
  9. name = "Daived"
  10. for eve in name {
  11. print(eve)
  12. }
  13. // Character类型数组生成String(String由Character组成)
  14. var nameCaracters:[Character] = ["D","a","i","v","e","d"]
  15. print(String(nameCharacter))
  16. // 连接字符串
  17. var str1 = "hello"
  18. var str2 = " world"
  19. // 加法运算符拼接
  20. print(str1 + str2)
  21. // 加法赋值运算拼接
  22. str1 += str2
  23. print(str1)
  24. // 附加方法
  25. str1.append(contentsOf: str2)
  26. print(str1)
  27. // 字符串插值(连接不同变量)
  28. var name = "Daived"
  29. var age = 10
  30. print("\(name) is \(age) years old")
  31. // 常用方法
  32. // 获取Character数
  33. var name = "Daived"
  34. print("\(name) has \(name.count) characters")
  35. // 判断字符串是否为空
  36. if name.isEmpty {
  37. print("姓名不能为空")
  38. }
  1. // 在32位平台上Int为Int32
  2. // 在64位平台上Int为Int64
  3. var num: Int
  4. var num64: Int64
  5. // -2,147,483,648 ~ 2,147,483,647
  6. var num32: Int32
  7. // 无符号
  8. // 最小值: UInt.min
  9. // 最大值: UInt.max
  10. var numU: UInt
  11. var numU32: UInt32
  12. var numU64: UInt64
  13. // 32位浮点数
  14. var float32: Float
  15. // 64位浮点数
  16. var float64: Double
  17. // π 保留7位小数
  18. var π: Float = Float.pi
  19. // π 保留15位小数
  20. var π: Float = Double.pi
  21. // 数值类型字面量
  22. var num = 1_000_000
  1. // 布尔值常用于控制流
  2. var isLogin = true
  3. if isLogin {
  4. // do something
  5. }
  1. // 元祖在swift属于复合类型
  2. // 声明后不可变
  3. var LoginError = (500,"login error")
  4. // 解构赋值
  5. var (code,msg) = LoginError
  1. // String
  2. var name = "Davied"
  3. // Int
  4. var num = 10
  5. // Double
  6. var float = 3.1415
  1. typealias Number = Int
  2. var num: Number = 10
  3. print(type(of: num))
  1. // 可选类型用于处理变量值为空的情况
  2. // 在其他语言中变量类型可能仅存在有值和无值的情况,并没有分别处理
  3. // 通过可选类型可以设置变量是否允许为空
  4. var name = "Davied"
  5. // 通过Int函数将类型转换为Int可选类型也就是Int?
  6. var num: = Int(name)
  7. // stdin: Optional<Int>
  8. print(type(of: num))
  9. // 声明可选类型
  10. var name: String?
  11. // 打印函数不允许非可选类型未初始化值
  12. print(name)
  13. // 判断值是否为空
  14. if name == nil {
  15. // 设置默认值
  16. // 实用空合运算符设置默认值
  17. print(name ?? "default")
  18. }else{
  19. // 强制解析(值为nil时抛异常)
  20. print(name!)
  21. // 强制解析可以将可选类型转为非可选类型
  22. // 还可以使用可选绑定的方式(简化判断可选类型为空)
  23. var str1 = name!
  24. print(type(of: str1))
  25. }
  26. // 可选类型绑定
  27. // 同样可以用于常量
  28. if var str1 = name {
  29. print(type(of: str1))
  30. }else{
  31. print(name ?? "default")
  32. }
  1. // 强制解析,可以将可选类型转为非可选类型,并获取值
  2. var name:String? = "Daived"
  3. var str1:String = name!
  4. print(type(of: str1))
  1. // 默认为一个可选类型
  2. var name:String! = "Daived"
  3. // 自动解析成非可选类型(此前需要强制解析)
  4. var str1:String = name

集合类型


  1. // 创建空数组
  2. var nums:[Int] = []
  3. print(nums.count)
  4. // 通过数组字面量创建(数组字面量默认推到为数组类型)
  5. var nums = [1,2,3,4]
  6. // 通过闭区间操作符创建
  7. var nums = Array(1...3)
  8. // 创建带默认值数组
  9. var threeDoubles = Array(repeating: 0.0, count: 2)
  10. print(threeDoubles)
  11. // 通过加法运算符或者加法赋值运算符组合数组
  12. print(nums + threeDoubles)
  13. // 通过isEmpty方法检查数组count是否为0
  14. print(nums.isEmpty) // false
  15. // 添加值
  16. nums.append(1)
  17. // 通过下标获取值
  18. print(nums[1])
  19. // 通过下标设置或者获取值时,下标必须是有效的
  20. var nums:[Int] = []
  21. nums[nums.count] = 10 // Fatal error: Index out of range
  22. // 遍历数组
  23. var nums:[Int] = [1,2,3,4]
  24. for num in nums {
  25. print(num)
  26. }
  27. // 遍历并同时获取下标和值
  28. for (index,value) in nums.enumerated {
  29. print("index: \(index) value: \(value)")
  30. }
  1. // 创建特定类型的空集合
  2. var names = Set<String>()
  3. // 集合中插入值
  4. names.insert("Daived")
  5. // 置空集合
  6. names = []
  7. print(type(of: names)) // 此时变量类型依然为Set<String>
  8. // 通过数组字面量创建集合
  9. var names:Set<String> = ["Daived","Bob","James"]
  10. print(names)
  11. // 通过数组字面量推断Set类型
  12. var names:Set = ["Daived","Bob"]
  13. // 集合同样支持count和isEmpty属性
  14. print("names Set has \(names.count) String")
  15. print(names.isEmpty)
  16. // 尝试删除Set元素
  17. var names:Set = ["Daived","Bob"]
  18. if let removedName = names.remove("Daived") {
  19. print("\(removedName)? I'm over it.")
  20. } else {
  21. print("I never much cared for that.")
  22. }
  23. print(names) // ["Bob"]
  24. // 判断是否包含值
  25. var names:Set = ["Daived","Bob"]
  26. if names.contains("Daived") {
  27. print("Daived in names")
  28. }
  29. // 遍历集合
  30. for name in names {
  31. print(name)
  32. }
  33. // 排序并生成Array
  34. var nums:Set = [3,1,2,4,5]
  35. for num in nums.sorted(){
  36. print(num)
  37. }
  38. // 集合常用操作
  39. var nums1:Set = [1,2,3,4]
  40. var nums2:Set = [3,4,5,6]
  41. // 交集
  42. print(nums1.intersection(nums2))
  43. // 并集
  44. print(nums1.union(nums2))
  45. // 对称差
  46. print(nums1.symmetricDifference(nums2))
  47. // nums1 在 nums2 中的相对补集合
  48. print(nums1.subtracting(nums2))
  49. var nums1:Set = [3,4]
  50. var nums2:Set = [3,4,5,6]
  51. // 是否被包含集合
  52. if nums1.isSubset(of: nums2) {
  53. print("num2 contain num1")
  54. }
  55. // 判断集合是否包含另一个集合
  56. if nums2.isSuperset(of: nums1) {
  57. print("num2 contain num1")
  58. }
  59. // 判断集合是否不相交
  60. var nums1:Set = [1,2]
  61. var nums2:Set = [3,4,5,6]
  62. if !nums2.isDisjoint(with: nums1){
  63. print("num1 isDisjoint num2")
  64. }
  1. // 创建空字典
  2. var userInfo:[String:String] = [:]
  3. var userInfo:Dictionary<String,String> = [:]
  4. // 设置Key Value
  5. userInfo["Name"] = "Daived"
  6. print(userInfo)
  7. // 字典置空
  8. userInfo = [:]
  9. print(userInfo)
  10. // 字典字面量创建字典
  11. var userInfo = ["Name":"Daived","Age":"18"]
  12. print(userInfo)
  13. // 集合同样支持count和isEmpty属性
  14. // ...
  15. // 检查更新是否成功
  16. var userInfo = ["Name":"Daived"]
  17. if let oldValue = userInfo.updateValue("Bob",forKey:"Name") {
  18. print("oldValue: \(oldValue)")
  19. print("newValue: \(userInfo["Name"] ?? "Null")")
  20. }else{
  21. print("Name Key not found")
  22. }
  23. // 检查值是否存在
  24. var userInfo = ["Name":"Daived"]
  25. if let age = userInfo["Age"] {
  26. print("age : \(age)")
  27. }else{
  28. print("not found key age")
  29. }
  30. // 遍历获取Key,Value
  31. var userInfo = ["Name":"Daived","Age":"18"]
  32. for (k,v) in userInfo {
  33. print("\(k) : \(v)")
  34. }
  35. // 遍历仅获取Key
  36. for key in userInfo.keys {
  37. print("key \(key)")
  38. }
  39. // 遍历仅获取Value
  40. for value in userInfo.values {
  41. print("value \(value)")
  42. }
  43. // 使用字典的Keys或者Values创建新数组
  44. var values = [String](userInfo.values)
  45. print("values \(values)")

控制流


  1. // 遍历集合类型、字符串
  2. // ...
  3. // 使用数字范围遍历
  4. // 使用_可忽略接受参数
  5. for num in 1...3 {
  6. print("num \(num)")
  7. }
  8. //

运算符


  1. var a = 10
  2. let b = a
  3. var (c,d) = (a,b)
  4. // 赋值运算符不会返回值
  5. // 所以以下流程控制语句无法编译
  6. if a = b {
  7. }
  1. var a = 10
  2. var b = 100
  3. // 加
  4. print(a + b)
  5. // 减
  6. print(a - b)
  7. // 乘
  8. print(a * b)
  9. // 除
  10. print(a / b)
  11. // 余
  12. print(b % a)
  13. // ...
  1. // 传统形式判断
  2. if question {
  3. // answer1
  4. }else {
  5. // answer2
  6. }
  7. // 可简化成以下三元表达式
  8. print(question ? answer1 : answer2)
  1. // 判空并进行强制解包
  2. var name: Strint?
  3. if name != nil {
  4. doSomething(name)
  5. }else {
  6. doSomething("default value")
  7. }
  8. // 使用三元表达式简化
  9. name != nil ? doSomething(name) : doSomething("default value")
  10. // 使用空合运算符简化(并返回非可选类型)
  11. doSomething(name ?? "default value")
  12. // 仅接收非空
  13. func doSomething(name: String) {
  14. print(name)
  15. }

错误


  1. // 定义错误枚举
  2. enum RequestError: Error {
  3. case BadGateway // 错误的网关
  4. case NoAuth // 没有授权
  5. case Paramter // 参数错误
  6. }
  7. // 创建函数抛出错误
  8. func doSomething() throws {
  9. throw RequestError.Paramter
  10. }
  11. // 捕获错误
  12. do {
  13. // 尝试执行函数,并抛出错误
  14. try doSomething()
  15. // 捕获错误
  16. } catch RequestError.Paramter {
  17. print("异常: 参数错误")
  18. }

/ 查询Ω