Swift基础语法

>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

}

}

你可能感兴趣的:(Swift基础语法)