>1swift来历:2014年推出,具有安全,现代,互动,快速的特点.
>2playground可以用来测试,学习新代码.新建playground,可以快速发现版本升级时swift语法的变化.
>3变量和常量
let x: String = “zhangsan” 定义后不可改变 ;var y: Int = 10,定义后可以改变 ,当没有指定具体类型时,Swift会对根据等号右边的内容进行自动推导为String,Int,Double
>4不同类型的变量不能直接进行运算,需要强制转换
>5可选项
let x: Int? = 10 可选项格式
let y = x! + 100 可选项使用,需要解包,当x为nil时,解包会报错,改进:
let y = (x ?? 0) + 100 (1)
if x != nil{ let y = x! + 100 } (2)
if let c = x {y = x! + 1000} (3)
>6控制流 Swift中没有非零即真的概念,必须明确的指明判断条件true/false
var x: Int? = 10
var m: Int? = 20
if let y = x { //使用这种判断方法较方便
x = 100
}
多重判断条件: if let y = x ,let z = m{
y = ...
z = ...
}
let point = CGPoint(x: 10, y: 10)
switch point{
case let p where p.x == 0 && p.y == 0:
print(“中心点”)
default:
print(“非中心点")
}
//单独判断时,switch的赋值部分可以省略
switch point{
case _ where point.x == 0 && point.y == 0:
print(“中心点”)
default:
print(“非中心点")
}
>6for循环
var sum: Int?
for i in 0..<10{ //不包括10
sum += i
}
for i in 0…10{//包括10
sum += i
}
for _ in 0…10{//当不用变量时,可以省略
print(10)
}
>7字符串
let str = “你很不一般"
//遍历
for ch in str.characters{
print(ch)
}
//长度
str.characters.count
str.utf8.count //编码字节长度
//拼接
str + “不一般啊不一般"
//转译形式(“\()")
//格式化字符串
let timeStr = String(format:”%02d:%02d:%02d”,arguments:[h,m,s])
//子字符串
varstr ="中国人很厉害"
letstartIndex = str.startIndex.advancedBy(0)
letendIndex = str.endIndex.advancedBy(-1)
letstr1 = str.substringWithRange(startIndex..
(str as NSString).substringWithRange(NSMakeRange(2,3))
>8数组
//定义空数组
var array = [String]()
array.append(“laozhang")
array.capacity//数组的容量,如果不够用,直接*2
array + [“1”,”2"]
array.removeFirstObject
let str = array[0]
//*当数组中存储结构体时,需要转变成NSValue的类型
var array1 = [“zhang”,18]
array1.append(NSValue(CGPoint: CGPoint(x: 10,y: 10))
>9字典
var dict = [“name” : “zhang”,”age” : 18] //常用字典类型 [String : NSObject]
dict[“no”] = “110"
for (a,b) in dict{
print(a,b)
}
>9函数
func demo() { 函数体 }//无参无返回值的最简单形式
func demo1(外部参数名1 内部参数名1: 参数类型, …) -> 返回值类型 { 函数体 }//有参有返回值函数
>10闭包
{ 代码实现 }//无参无返回值的闭包,最简单的形式
{ (参数1: 参数类型,…) -> 返回值类型 in 代码实现 }//有参有返回值的闭包
函数是闭包的一种特殊形式,可以类比构造函数
当闭包是函数的最后一个参数时,小括号可以提前结束,当做尾随闭包来使用
>11函数循环引用的解决方案
deinit //析构函数,当对象释放的时候执行
__weak typeof(self) weakSelf = self (1)//释放后self指向nil
__unsafe__unretain typeof(self) weakSelf = self (2)//释放后成为野指针
__weak typeof(self) weakSelf = self (3)
{ __strong typeof(self) strongSelf = weakSelf }
>12闭包循环引用的解决
loadData {[weak self] in
}(1)
loadData {[unowned self] in
}(2)
>13构造函数
一个类中定义的必选属性,需要通过构造函数对其进行初始化
重写父类的构造函数: override init( ) { }
重载构造函数: init(name: String,age: Int){ }
本类的属性初始化操作需要放在调用super.init()之前,保证本类属性初始化完成
重写/重载的构造函数本身默认都会调用super.init()完成父类的初始化
>14KVC
可选属性开始时并没有分配存储空间
var age: Int = 0//默认对Int的属性进行复制后,才能为Int的属性开辟空间
KVC运行实质是不断发送setValue: forKey消息
KVC语句放在super.init() 后,保证对象初始化完成
>14便利构造函数
convenience init?(name: String, age: Int) {
if age < 20 || age > 100 {
return nil
}
self.init(dict: ["name": name, "age": age])
}
便利构造函数可以返回nil
只有在便利构造函数中可以使用self.init()
便利构造函数不可以被重写或super,但可以被继承
>15懒加载
lazy var person: Person = {
return Person( )
}( ) //格式
lazy var person: Person = Person( )//简单写法
>16存储型属性
var title: String {
get {
return “Mr” + (name ?? “")
}
}//格式
var title: String {
return “Mr” + (name ?? “")
}//简化格式 //不占用内存空间
var person: Person {
didSet{
self.nameL.text = person.name
self.ageL.text = person.age
}
}