Men的博客

欢迎光临!

0%

Swift MJ

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(message: T, file: String = #file, funcName: String = #function,lineNum: Int = #line) {
    #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()的使用