一.变量和常量
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()