【Swift3基础】基础语法
2017-04-25 本文已影响96人
亲爱的大倩倩
/*基本说明
创建游乐场,可以立即看到效果
创建对象:
OC:alloc init
Swift: XXX()
调用方法
OC: [UIColor redColor];
Swift: UIColor.red
枚举:
OC: UIButtonTypeContactAdd
Swift:UIButtonType.contactAdd 其中UIButtonType可以省略
创建结构体
OC: CGPointMake()
Swift: CGPoint()
*/
let view = UIView(frame: CGRect(x:100 ,y:100 , width: 50, height:100))
view.backgroundColor = UIColor.red
let btn = UIButton(type: .contactAdd)
btn.center = CGPoint(x: 25, y: 50)
view.addSubview(btn)
/*常亮和变量
let: 定义常量,不可修改
var: 定义变量,可修改
注意: swift中定义常量和变量不需要写数据类型,编译器会根据后面的真实类型自动推导,10是int型,10,1是double类型
每行语句末尾可以不写分号结尾(写了也没关系),若不写会自动将换行作为语句结尾,如果一行有多条语句,那么每条语句结尾必须写上分号
*/
/*数据类型转换
OC: 数据类型写在变量前面
Swift: 数据类型写在变量后面,并且用冒号隔开
强制转换: 数据类型()
Swift中不存在隐式类型转换,所有类型转换都是显示的,如下面let sum = num1 + num2会报错,但OC会自动将num1变成10.0再相加
*/
/*
分支_if
Swift中if使用基本和OC一致
1.Swift中if可以省略后面的()
2.Swift中哪怕if后面只有一条语句,也不能省略{}
3. 在C和OC中,if括号内非0即真
在Swift中,if括号内只能放bool值,取值只有两个 true/false,若是if a 则错误
分支_if else
1.Swift中if else和OC一样使用
2.但Swift中if else可以使用三目运算符简写
分支_switch
1.switch后面的()可以省略,case后面的break可以省略
2.OC中如果没有break会穿透,但Swift不会穿透
3.OC中如果要在case中定义变量要加{}作用域,Swift不用
4.OC的default位置可以随便放,只要所有case都不满足就会执行default,但Swift中default只能放在最后
5.OC中的default可以省略,但Swift中大部分不能省略
分支_for循环
以下...之间不可有空格
0..<10 代表一个区间范围,含头不含尾,从0到9,按下面的例子,会将0-9之间的值,依次赋值给i,然后在执行循环中的打印语句,若不需要i,可以使用_
_ 代表忽略,如果不关心某个参数,就可以使用_
0...10 代表一个区间范围,含头含尾,从1-10
分支_while循环
Swift中while循环和OC中使用一样
分支_do while循环
do while没有do,因为do被用于捕获异常了
*/
/*可选类型:如下列,url创建的可能有值也可能是nil(url含中文),所以就返回可选类型
Optional 代表可以有也可以没有
convenience init? 若看到方法或数据类型后面有? 代表返回的是一个可选类型
注意: 若打印可选类型,结果会被Optional包裹,如果不想被包裹,则需要加一个!
! 代表告诉编译器,可选类型中一定有值,强制解析
如果可选类型中没有值,而又强制解析,则会崩溃
可选绑定,会将url中的值取出来赋值给urlFinal变量,如果值不为nil,才会进入{},按住Option看到urlFinal是不带?的,而上面的url是带?的
*/
/*字符串String是个结构体,而OC中是NSString是个对象,继承与NSObject
定义: OC用@"",Swift用""
拼接: 直接+=
格式化拼接: \()或者format,arguments,其中format,arguments需要将所有的值放入数组中
和OC转化: : NSString或as NSString
截取: 使用OC的字符串截取,先将Swift字符串转化成OC字符串再截取
遍历: for循环直接遍历
*/
/*备注
SWift特点:
快速,现代,安全,互动,明显优于OC
可用框架Cocoa 和Cocoa Touch
取消了OC的指针和其他不安全性的访问,OC是动态运行时,你写的即时不对,编译也不报错,但Swift会在编译的时候报错
舍弃了OC的smalltalk语法,改为句点表达法
提供了类似Java的名字空间,泛型,运算对象重载等高级语法
Swift是没有C的OC
开发技巧: 按住option,点num即可看到类型
句末不用分号结尾,Swift会自动帮我们在句末添加分号,但如果一行有多句语句,要用分号隔开
Swift是强语言,OC是弱语言,若是在OC中 int a = 10.1,OC会将a强制转化成10
Swift中数据类型首字母大写
没有C中的++和-- 变成了+=1
OC是在运行时发现错误,?和!的使用,使得Swift是在编译过程中就发现大部分错误
? 可选类型,可以有值也可以没值
! 强制解析,之前要进行判断
控制器中能不写self,就不写self,你写在哪个控制器内的view,就证明你调的是那里的view
看见self证明你是在闭包中
通过调用栈来分析调用步骤
*/
/*
OC的Block: 类似于匿名函数,用于保存一段代码,在需要的时候执行
Swift的闭包:也是用来定义函数,也用于保存一段代码,在需要的时候执行
作用:在耗时操作时使用
定义: in用来去等形参返回值和执行代码
{
(形参列表) -> (返回值)
in
需要执行的代码
}
*/
func sum (number1:Int, number2:Int) -> Int
{
return number1 + number2;
}
func loadData(finished: ()->())
{
print("执行耗时操作")
finished()
}
//在viewDidLoad中调用
let sumTwoNubmer = sum(number1:2, number2: 3)
print(sumTwoNubmer)
loadData(finished:
{print("被回调了")
view.backgroundColor = UIColor.red
})
//要求:定义一个方法来创建UIScrollView,并且UIScrollView上有多少个按钮必须通过闭包来告诉该方法
func creatScrollView(btnCount: () -> Int) -> UIScrollView
{
//1.创建scrollView
let sc = UIScrollView(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
sc.backgroundColor = UIColor.red
//创建N多Button
let count = btnCount()
for i in 0..<count
{
let btn = UIButton(frame: CGRect(x: i*80, y: 0, width: 80, height: 30))
btn.setTitle("标题\(i)", for: UIControlState.normal)
btn.backgroundColor = UIColor.blue
sc.addSubview(btn)
}
sc.contentSize = CGSize(width: count*80, height: 0)
return sc
}
//在viewDidLoad中调用
//闭包创建button个数,当调用这个方法时候,调用下面的creatScrollView函数,当执行到let count = btnCount(),会返回来调用这个闭包,得到5,再将值赋值给count
let sc = creatScrollView { () -> Int in
return 5
}
view.addSubview(sc)
//循环引用
//定义属性保存block最容易出现循环引用,在闭包中使用了self就循环引用了
//析构函数,相当于OC中的dealloc
deinit
{
print("被销毁")
}
//懒加载:用到时再加载,节约性能,并且只加载一次
//格式:定义变量时前面使用lazy来修饰变量,后面通过等号赋值一个闭包
//注意1.必须用var修饰,注意2:闭包后面必须跟上()注意3:如果闭包是用于懒加载,那么in之前的代码都可以删除,包括in
lazy var dataList: [String] =
{
() -> [String]
in
print("懒加载执行了")
return["1","2","3"]
}()
lazy var dataList2: [String] =
{
print("哈哈哈哈哈哈")
return["6","7","7"]
}()
//懒加载执行了这句话只会调用一次,但会按点击次数输出["1","2","3"]
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
print(dataList)
print(dataList)
print(dataList)
print(dataList2)
print(dataList2)
print(dataList2)
}