一、数据类型
1.基本数据类型
let a:Int = 12 //声明整形常量a , let 代表常量,Int代表整形
var b:Float = 10.2 //声明浮点型变量b,var代表变量,Float代表浮点型,初值为10.2
let str = "helloWorld"
str.characters.count //计算字符串长度
str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) //计算字符串长度
注:字符串相等判断: "==",字符串拼接判断:“+”
str.uppercaseString // 首字母大写
str.lowercaseString // 首字母小写
// 格式化字符串(两种方法)
let str2 = String(format: "%02d:%02d", 1,2); //方法1
let str3 = String(format: "%02d-%02d", arguments: [1,2]) // 方法2
2.数组 Array (跟OC里面的数组一样可以相互转换)
a.不可变数组
let array1 = ["A", "2", "3", "4"] //定义不可变数组array1
// initWith/init在swift里面全部转换为(),代表初始化
let array2 = [String]() //初始化定义不可变数组array2
// 访问数组元素个数 .count
// 数组遍历 for-in(明确指出数组的类型)
for temp in array1 as [String]{
print(temp.characters.count)
}
// 元组遍历
for(index, value) in array1.enumerate()
{
print("index = \(index), value = \(value)") // \(参数)为占位符
}
// b.可变数组
var mutableArray = [String]() // 定义可变数组(类型为NSString)
mutableArray.append("hello") // 添加元素
//mutableArray.append(23) //类型不匹配
mutableArray.removeAll() //移除数组元素
// mutableArray.removeFirst(<#T##n: Int##Int#>) 从第一个元素开始移除, 直到n结束
3. 字典 Dictionary
let dict = ["key1":"value1", "key2":"value2", "key3":"value3"] //定义不可变字典
// 通过key值访问value
print(dict["key1"])
// for-in遍历
for (key,value) in dict // 遍历字典里面所有的key和value
{
print("key = \(key), value = \(value)")
}
var dict3 = ["key":"value"]
for (tempkey, tempValue) in dict{
// 如果key存在, 则是一个更新键值对操作, 否则是一个增加键值对操作
dict3[tempkey] = tempValue
}
4. ? 与 !的应用
// 如果一个值可能为nil, 那么这个值就是可选类型,用?标识
// optional包围的就是一个可选类型
// 可选类型不能直接使用, 必须进行强制解包,!强制解包, 对nil强制解包会造成崩溃
var a1:String?
a1 = "12345"
// !!!!!unexpectedly found nil while unwrapping an Optional value 对一个空的可选类型进行强制解包
// (a1 ?? "234") 对一个空的可选类型进行强制解包, 如果可选类型为nil, 则给他一个默认值
print((a1 ?? "234").characters.count)
二. 分支语句
// if 条件语句()可以省略, {}不能省略
// if 没有非0即真的概念, 只有true 和 false 的两种情况
let tempValue = 10
if tempValue > 5{
print("tempValue > 5")
}
1. 可选类型的条件分支
let str:String? = "hello"
a.if-let
对可选类型的判断, 如果可选类型为空, 则不执行代码块, 如果不为空, 则用tempStr来接收此刻这个可选类型解包后的值
// 只针对可选类型 ?
if let tempStr = str{
print(tempStr)
}
if str !=nil // 安全处理,防止str为空导致crash
{ str! }
b.if-let-where
跟if-let 相似, where是对前面定义的这个局部变量在做一层判断
if let tempStr = str where tempStr.characters.count > 2{
print("tempStr.length = \(tempStr.characters.count)")
}
c. guard-let-else
如果可选类型str为nil,则执行code代码块, 最后一定要return, 如果不为nil, 则强制解包后的值赋值给tempStr, 这样在{}外面就可以使用tempStr
guard let tempStr = str else
{
//code
return
}
tempStr...
2. switch分支语句
switch 不局限判断整形, 可以为浮点型, 也可以是字符串...
switch 判断后面的小括号可以省略, 大括号不能省略
case 后面至少要有一条执行语句!!!!并且case后面的大括号可以省略, break可以不写, 不会造成贯穿
default一定要写, 并且只能写在最后
let f = 3.2
switch f
{
case 3.0:
print("===3.0")
case 3.1:
print("===3.1")
case 3.2:
print("3.2")
default:
print("know")
}
3. for...in 遍历
for (var i = 0; i < 5; i++){ swift2.2的时候被废弃
}
for var i = 0;i < 5; i += 1{
print(i)
}
for i in 0..<5 { // 0..<5-----[0,5) 0...5-----[0,5]
print("i = \(i)")
}
三. 枚举
a.枚举值可以关联浮点, 字符串, 没有默认的关联值,关联如果是Int, 会默认的递增上去, 如果不是Int类型, 必须每个枚举值都关联上
enum Month:CGFloat{ // 定义枚举
case January = 10.1
case February = 10.2
case March = 10.3
case April = 10.4
}
b.如果明确指出一个变量/常量是属于哪种枚举类型的话, 可以直接.枚举值, 否则就 枚举类型.枚举值
/*
let month:Month = .February // 定义month枚举常量,值为February
var month1 = Month.January //定义month1枚举变量
month1 = .February
*/
switch month{
case .January:
print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")
print(month)
case .February:
print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")
print(month)
case .March:
print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")
print(month)
case .April:
print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")
print(month)
}
注:hashValue 的值为位置, rawValue为关联的值