从事iOS开发已经有俩年了,对于OC的学习自以为到了瓶颈了,现在正在摸索新的出路,于是RxSwift
入眼帘。但是这个框架的学习需要有swift的基础,所以看了一些关于swift
中级教程的资料和视频,把自己认为的难点记录下来,以供自己以后的复习。
外部参数和内部参数
func sum (num1 x:Int , num2 y:Int)
{
return x + y
}
1.外部参数 num1,num2 是供外部调用的参考的,保证语义更加清晰
2.内部参数 x ,y 是供内部函数使用的
闭包
-
闭包的返回值
用来接收闭包执行的结果,然后继续后续代码 -
闭包的参数
用来将内容传递给闭包内部
override func viewDidLoad() {
super.viewDidLoad()
let f = CGRect(x:0 , y:100, width: kScreenW, height: 50)
let s = scroll(frame: f, count: { () -> Int in
return 10
}) { (indexs) -> UILabel in
let l = UILabel()
l.text = "标签/(index)"
l.font = UIFont.systemFont(ofSize: 18.0)
l.sizeToFit()
l.font = UIFont.systemFont(ofSize: 15.0)
return l;
}
view .addSubview(s)
}
func scroll(frame:CGRect,count:()->Int,indexL:(_ indexs:Int)->UILabel ) -> UIScrollView{
let s = UIScrollView(frame: frame)
s.backgroundColor = UIColor.red
let c = count()
let margin : CGFloat = 10
var x : CGFloat = margin
for i in 0..
构造函数以及作用
- 在
Swift
支持重载 ,函数名相同,参数的数量和类型不同 - 分配空间
-
convenience
声明的遍历
构造函数 才可以返回nil,并且只有他可以调用self.init()
-
func
声明的指定
构造函数不能返回nil
class HMLabelSrollViiew: UIScrollView {
init(frame: CGRect,count:()->Int,indexL:(_ indexs:Int)->UILabel) {
super.init(frame: frame)
backgroundColor = UIColor.red
let c = count()
let margin : CGFloat = 10
var x : CGFloat = margin
for i in 0..
override func viewDidLoad() {
super.viewDidLoad()
let f = CGRect(x:0 , y:100, width: kScreenW, height: 50)
let s = HMLabelSrollViiew(frame: f, count: { () -> Int in
return 12;
}) { (index) -> UILabel in
let l = UILabel()
l.text = "标签/(index)"
l.font = UIFont.systemFont(ofSize: 18.0)
l.sizeToFit()
l.font = UIFont.systemFont(ofSize: 15.0)
return l;
}
}
懒加载
懒加载
其实就是一个闭包,闭包只执行一次
lazy
的用法 没有lazy来修饰 控制器一旦创建 就会被执行
lazy var dataList:[String] =
{
return ["张三","李四"]
}()
throw(抛出异常)
JSON
的本质就是一个特殊的格式的字符串
反序列化
throw会抛出异常
使用try!
强行解包如果JSON数据格式不对会出现异常
let json = "{\"name\" : \"laowang\"}"
let jsonData = json.data(using: .utf8)!
do{
_ = try JSONSerialization.data(withJSONObject: jsonData,
options: [])
}catch
{
print(error)
}
guard let/ if let的使用
使用同名的变量接受值,在后续使用的都是非空值,不需要解包
func demo(name:String? , age:int?)
{
guard let name = name, age = age
{
// 值为非空值
}
}