Swift 基础语法入门(一)
一.变量和常量
1.声明常量和变量
用let来声明常量 let radius = 10
用var来声明变量 var age = 20 或者是var x = 0.0, y = 0.0, z = 0.0
2.基本上可以用任何你喜欢的字符作为常量和变量名
(1)let π = 3.14159
(2)let 网址 = "http://ios.itcast.cn"
(3)let 🐶🐮 = "小狗和母牛"
// 🐶和🐮是emoji表情,是一种特殊的Unicode字符
// 可以在Mac上通过快捷键:control + command + 空格 ,弹出emoji键盘
3.常量和变量名的注意点
不能包含数学符号(比如 + 、-、 *、\ )
不能包含箭头(比如↑、↓、←、→)
不能包含非法无效的Unicode字符(比如⚽ )
不能是关键字(比如let、var)
不能以数字开头(比如 123go)
不能是单独一个下划线 _ (比如var _ = 10)
… …
二.可选项,控制流
// 定义 可选项使用? // 解包使用! let x: Optional = 10; let y: Int? = 20 print(y) print(x)
func demo(x: Int?, y: Int?){ // let x: Int? = 10 // let y: Int? = 200 // 强行解包有风险 // print(x! + y!) // 使用if 判断 // 但是 如果使用if 一不小心 会让代码很丑陋 if x != nil && y != nil { print(x! + y!) }else{ print("x 或者 y 为 ni") } } //MARK: - ?? 操作符 func demo1(x: Int?, y: Int?){ /** ?? 是一个简单的 三目 - 如果优质 ,使用值 - 若果没有值 使用 ?? 后面的值进行替代 ?? 的操作符号的优先级"低“ 在使用的时候最好加上() 包一下 */ print((x ?? 0) + (y ?? 0)) } // MARK: - if let / var 连用语法 目的就是判断值 func demo2() { let oName: String? = "老王" let oAge: Int? = 10 if oName != nil && oAge != nil { print(oName! + String(oAge!)) } // if let 连用 判读对象的值是否为nil, {}内一定有值,可以直接使用,不需要解包 if let name = oName, let age = oAge { // 进入分之 之后 name 和age 一定有值 不需要强行解包 print(name + String(age)) }else{ print("name 或者 age 为 ni") } } //MARK: - guard 守卫/守护 /** guard let 和 if let 刚好相反 */ func demo3() { let oName: String? = "老王" let oAge: Int? = 10 // guard let 守护一定优质 ,如果没有 则返回 guard let name = oName, let age = oAge else { print("姓名或者年龄为nil") return } // 代码执行至此, name和age 一定优质! // 通常判断是否有值之后,会做具体的逻辑实现,通常代码多 // 如果用if let 凭空多出一层分支,guard 是降低分支层次的办法 // guard 的与方法语法 Swift 2.0 推出的 print(name + String(age)) } // guard let 和 if let 的技巧 // 使用同名的变量接收值,在后续使用的都是非空值,不需要解包 // 好处 可以避免取名字的烦恼 func demo4(name: String?, age: Int?) { guard let name = name, let age = age else { print("姓名或者年龄为nil") return } print(name + String(age)) } //demo(x: 10, y: nil) //demo3() demo4(name: "老王", age: 18)
// 不同类型之间的值不能直接运算 如果没有值是nil 不是任何数据类型 不能参与计算 // "!" 强行解包 - 从可选值中强行获取对应的非空值 如果真的是nil 就会崩溃
// 程序员必须为每一个 ! 负责 // 程序中少用 “!” print(x! + y!) // var 的可选值默认为nil // let 的可选值没有默认值
三,字符串
func demo() { let str = "我要飞的跟高" for c in str.characters { print(c) } } // 字符串长度 func demo1() { let str = "hello world" // 返回指定编码的对应的字节数量 //UTF 的编码是(0-4 个) 每个汉字是3个字节 print(str.lengthOfBytes(using: .utf8)) // 字符串的长度 print(str.characters.count) // 使用NSString 中转、 // swift 中可以使用“ 值 as 类型” 类型转换 let ocStr = str as NSString print(ocStr.length) } // 字符串拼接 func demo2() { let name = "老王" let age = 18 let title: String? = "Boss" let point = CGPoint(x: 100, y: 200) // 字符串拼接的时候注意可选项 let str = "\(name) \(age) \(title ?? "") \(point)" print(str) } // MARK: - 格式化 func demo3() { let h = 8 let m = 9 let s = 6 let dataStr = "\(h):\(m):\(s)" print(dataStr) // 使用格式化字符串 let dataStr1 = String(format: "%02d:%02d:%02d", h, m, s) print(dataStr1) } //MARK: - 字符串子串 func demo4() { //建议:一般使用NSString 作为中转 let str = "我们一起去飞" let ocStr = str as NSString let s1 = ocStr.substring(with: NSMakeRange(2, 3)) print(s1) //前面的字符串里面的内容表示 长度 print(str.substring(from: "我们".endIndex)) print(str.substring(from: "我g们".endIndex)) // 取字符串的范围 guard let range = str.range(of: "一起") else { print("没有找到") return } print(range) print(str.substring(with: range)) } //demo1() //demo3() demo4()
四,集合
func demo1() { let array = ["张三", "小芳", "小样"] print(array) // Swift 中基本数据类型不需要包装 let array1 = [1, 2, 3, 4] print(array1) let p = CGPoint(x: 100, y: 200) let array2 = [p] print(array2) /* 混合数组 如果数组中的类型不一致,自动推到结果 [NSObject] 在swift中海油一种类型[AnyObject] -> 任意对象 在swift 中一个类可以没有任何父类 **** 在混合数组中 CG 结构体需要包装 */ let array4 = ["张三", 1, NSValue(cgPoint: p)] as [Any] print(array4) } func demo2() { // 数组合并的的时候必须类型一致 var array: [Any] = ["历史", "数学"] let array1 = ["地理", 1] as [Any] array += array1 print(array) } demo1()