1.swift界面编写规范,代理和UI分别放在extension中
2.类的属性,可以使用setvauleforkeywithDict:,但是必须重写父类的方法forundifne
3.swift闭包写法,block()->(){
}
4.swift闭包的声明 :block(()->())();
5.swift闭包避免循环引用:
block([weak self])->(){
}
5.自定义构造函数
6.swift定义log
buying seeing 里面找 swift flag,添加标记
func FDLog
#if DEBUG
let fileName = (file as NSString).lastPathComponent
print(“(fileName):((lineNum))-(message)”);
#endif
}
7.swift字符串转类
命名空间
//获取命名空间
guard let name = NSBundle.mainBundle().infoDictionary![“CFBundleName”] as? String else {
DDLog(“获取BundleName失败”)
return;
}
//拼接命名空间
let clas :AnyClass? = NSClassFromString(name + “.” + childControllerString)
//将命名空间转化为UITableViewController类型
guard let childControllerClas = clas as? UITableViewController.Type else {
DDLog(“转换类型失败”)
return
}
swift异常处理
如果在调用系统某个方法时,该方法最后有一个throws,说明该方法会剖出异常,如果一个方法会剖出异常,那么需要对该异常进行处理
在swift中提供三种处理异常的方式
1.try方式:程序员手动捕捉异常
do{
try a
} cash {
//异常对象的处理
}
2.try?方式(常用)系统帮助我们处理异常,如果该方法出现异常,则该方法返回nil,若果没有异常,则返回对应的对象
guard let a = try?b else{
return
}
方式三:try!方法(不建议使用,非常危险),直接告诉系统,该方法没有异常,注意:如果该方法有异常,那么程序会直接报错,奔溃
let a = try!b
swift中类方法就是以class开头的方法
扩展系统的类,就是扩展系统init方法,构造函数
// convenience : 便利,使用convenience修饰的构造函数叫做便利构造函数
// 遍历构造函数通常用在对系统的类进行构造函数的扩充时使用
/*
遍历构造函数的特点
1.遍历构造函数通常都是写在extension里面
2.遍历构造函数init前面需要加载convenience
3.在遍历构造函数中需要明确的调用self.init()
*/
convenience init (imageName : String, bgImageName : String) {
self.init()
事件监听
事件监听的本质发送消息,但是发送消息是OC的特性
将方法包装成@SEL--》类中查找方法列表--》根据@SEL找到imp指针(函数指针)--》执行函数
如果swift中将一个函数声明称private,那么该函数不会被添加到方法列表中
@objc private func loginBtnClick() {}
我们通常在swfit中添加@objc,标示这是一个OC的方法。
如果在private前面加上@objc,那么该方法依然后被添加到方法列表中
创建动画。设置动画的属性
// 1.创建动画
let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z")
// 2.设置动画的属性
rotationAnim.fromValue = 0
rotationAnim.toValue = M_PI * 2
rotationAnim.repeatCount = MAXFLOAT
rotationAnim.duration = 5
rotationAnim.removedOnCompletion = false
// 3.将动画添加到layer中
rotationView.layer.addAnimation(rotationAnim, forKey: nil)
removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards .
// MARK:- 重写init函数
override init(frame: CGRect) {
super.init(frame : frame)
setImage(UIImage(named: "navigationbar_arrow_down"), forState: .Normal)
setImage(UIImage(named: "navigationbar_arrow_up"), forState: .Selected)
setTitleColor(UIColor.blackColor(), forState: .Normal)
sizeToFit()
}
// swift中规定:重写控件的init(frame方法)或者init()方法,必须重写init?(coder aDecoder: NSCoder)
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
swift中可以直接修改控件的x,y,with,height值
设置modal样式
// 1.创建弹出的控制器
let popoverVc = PopoverViewController()
// 2.设置控制器的modal样式
popoverVc.modalPresentationStyle = .Custom
// 3.设置转场的代理
popoverVc.transitioningDelegate = popoverAnimator
popoverAnimator.presentedFrame = CGRect(x: 100, y: 100, width: 180, height: 250)
// MARK:- 自定义构造函数
// 注意:如果自定义了一个构造函数,但是没有对默认构造函数init()进行重写,那么自定义的构造函数会覆盖默认的init()构造函数
init(callBack : (presented : Bool) -> ()) {
self.callBack = callBack
}
注意:在闭包中如果使用当前对象的属性或者调用方法也需要加self
//两个地方的self使用:
1.如果在一个函数中出现奇异的地方
2.在闭包中使用当前对象的属性和方法也要添加self,注意循环引用的解决
private lazy var popoverAnimator : PopoverAnimator = PopoverAnimator {[weak self] (presented) -> () in
self?.titleBtn.selected = presented
}
swift使用pods
注意:要大开user_frameworks!的注释部分
swift中计算属性的使用
很多情况下我们可以给一个变量一个计算属性,,当使用这个变量的时候,初始化这个变量的时候就可以获得计算后的值
// ?? : 如果??前面的可选类型有值,那么将前面的可选类型进行解包并且赋值
// 如果??前面的可选类型为nil,那么直接使用??后面的值
let url = NSURL(string: profileURLString ?? "")
iconView.sd_setImageWithURL(url, placeholderImage: UIImage(named: “avatar_default_big"))
textVIew属性hasText()的使用