Swift-常用知识点BaseConfig

气泡图片设置填充方式

选中该图片->设置Slicing方式

 

②便利构造函数convenience

extension UIButton {
    
    // convenience : 便利,使用convenience修饰的构造函数叫做便利构造函数
    // 遍历构造函数通常用在对系统的类进行构造函数的扩充时使用
    /*
     便利构造函数的特点
     1.遍历构造函数通常都是写在extension里面
     2.遍历构造函数init前面需要加载convenience
     3.在遍历构造函数中需要明确的调用self.init()
     */
    convenience init (imageName : String, bgImageName : String) {
        self.init()
        setImage(UIImage(named: imageName), for: .normal)
        setImage(UIImage(named: imageName + "_highlighted"), for: .highlighted)
        setBackgroundImage(UIImage(named: bgImageName), for: .normal)
        setBackgroundImage(UIImage(named: bgImageName + "_highlighted"), for: .highlighted)
        sizeToFit()
    }
}

③懒加载属性

// MARK:- 懒加载属性
private lazy var titleBtn : TitleButton = TitleButton()

 

④归档-解档对象

    // MARK:- 归档&解档
    /// 解档的方法
    required init?(coder aDecoder: NSCoder) {
        access_token = aDecoder.decodeObject(forKey: "access_token") as? String
        uid = aDecoder.decodeObject(forKey: "uid") as? String
        expires_date = aDecoder.decodeObject(forKey: "expires_date") as? NSDate
        avatar_large = aDecoder.decodeObject(forKey: "avatar_large") as? String
        screen_name = aDecoder.decodeObject(forKey: "screen_name") as? String
    }
    
    /// 归档方法
    func encode(with aCoder: NSCoder) {
        aCoder.encode(access_token, forKey: "access_token")
        aCoder.encode(uid, forKey: "uid")
        aCoder.encode(expires_date, forKey: "expires_date")
        aCoder.encode(avatar_large, forKey: "avatar_large")
        aCoder.encode(screen_name, forKey: "screen_name")
    }

 ⑤正则匹配

/*
练习1:匹配abc

练习2:包含一个a~z,后面必须是0~9 -->[a-z][0-9]或者[a-z]\d
    * [a-z] : a~z
    * [0-9]/\d : 0~9

练习3:必须第一个是字母,第二个是数字 -->^[a-z][0-9]$
    * ^[a-z] : 表示首字母必须是a~z
    * \d{2,10} : 数字有2到10
    * [a-z]$ : 表示必须以a-z的字母结尾

练习4:必须第一个是字母,字母后面跟上4~9个数字

练习5:不能是数字0-9

    * [^0-9] : 不能是0~9



练习6:QQ匹配:^[1-9]\d{4,11}$
都是数字
5~12位
并且第一位不能是0


练习7:手机号码匹配^1[3578]\d{9}$
1.以13/15/17/18
2.长度是11
*/

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let str = "13324132423"
        
        // 1.创建正则表达式规则
        let pattern = "^1[3578]\\d{9}$"
        
        // 2.创建正则表达式对象(try try? try!)
        guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
            return
        }
        
        // 3.匹配字符串中内容
        let results = regex.matches(in: str, options: [], range: NSRange(location: 0, length: str.characters.count))
        
        // 4.遍历数组,获取结果
        for result in results {
            print((str as NSString).substring(with: result.range))
            print(result.range)
        }
    }


}

 //微博数据匹配

       let statusText = "@coderwhy:【动物尖叫合辑】#肥猪流#猫头鹰这么尖叫[偷笑]、@M了个J: 老鼠这么尖叫、兔子这么尖叫[吃惊]、@花满楼: 莫名奇#小笼包#妙的笑到最后[好爱哦]!~ http://t.cn/zYBuKZ8/"
        
        // 1.创建匹配规则
        // let pattern = "@.*?:" // 匹配出来@coderwhy:
        // let pattern = "#.*?#" // 匹配话题
        // let pattern = "\\[.*?\\]" // 匹配表情
        let pattern = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?" // URL网址
        
        // 2.创建正则表达式对象
        guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
            return
        }
        
        // 3.开始匹配
        let results = regex.matches(in: statusText, options: [], range: NSRange(location: 0, length: statusText.characters.count))
        
        // 4.获取结果
        for result in results {
            print((statusText as NSString).substring(with: result.range))
        }

 

 ⑥@escaping逃逸闭包

    //@escaping标明这个闭包是会“逃逸”,通俗点说就是这个闭包在函数执行完成之后才被调用
    //没有逃逸的闭包的作用域是不会超过函数本身的,所以说我们不需要担心在闭包内持有self。逃逸的闭包就不同了,因为需要确保闭包内的成员依然有效,如果在闭包内引用self以及self的成员的话,就要考虑闭包内持有self的情况了。
    //@escaping标记可以作为一个警告,来提醒使用这个函数的开发者注意引用关系。
    func checkChildren(pageIndex: Int, childExistBlock: @escaping ()-> Void){
        guard let children = SCUserDefaults[.userInfo]["userChildren"] as? [Any], !children.isEmpty else{
            self.showNodataView(pageIndex: pageIndex)
            return
        }
        if nodataView != nil {
            nodataView.removeFromSuperview()
            nodataView = nil
        }
        childExistBlock()
    }

 ⑦循环引用

        weak var weakSelf = self
        loginVC.loginBlock = {[weak self] in
            weakSelf!.selectedIndex = 0
            self?.postNotify(name: "loginSuccess")
        }

 ⑧extendedLayoutIncludesOpaqueBars(状态栏)

        self.interactivePopGestureRecognizer?.delegate = self
        navigationBar.shadowImage = UIImage()
        navigationBar.setBackgroundImage(image, for: .top, barMetrics: .default)
        navigationBar.titleTextAttributes = [.font:UIFont.boldSystemFont(ofSize: 19),.foregroundColor:UIColor.white]
        navigationBar.isTranslucent = false
        // 视图延伸不考虑透明的Bars(这里包含导航栏和状态栏)
        // 意思就是延伸到边界
        extendedLayoutIncludesOpaqueBars = true //这个属性在状态栏不透明的状态下才生效(不透明的条下可以扩展)
        // 意思就是空出导航栏位置
        //extendedLayoutIncludesOpaqueBars = false
        edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
        self.navigationBar.tintColor = UIColor.white

 ⑨typealias:

用来为已存在的类型重新定义名字,支持泛型

 

10.Xcode配置类名前缀

选中项目->打开右边栏

 

11.OC引用Swift界面属性:

要在属性前+@objc

    @objc var homeworkDic : HomeworkFunc?
    var tbView : GroupShadowTableView!
    @objc var isUnPublishMode : Bool = true {
        didSet{
            client.isUnPublishMode = isUnPublishMode
        }
    }

 

 12.Swift 字典中修改某个属性的值(null替换为空字符串"")

 

/// 默认字典类型
typealias SCDefaultDic = [String: Any]

 

     func saveCache(){
        var tempDic = dataDic
        if let homeworks = dataDic["homeworks"] as? [SCDefaultDic], !homeworks.isEmpty{
            var tempArray = homeworks
            for idx in 0..<homeworks.count{
                var temItem = homeworks[idx]
                if temItem["homeworkImage"] is NSNull {
                    temItem["homeworkImage"] = ""
                    tempArray[idx] = temItem
                }
            }
            tempDic["homeworks"] = tempArray
        }
        dataDic = tempDic
        // 传递作业参数给 聊天室进行展示
        SCUserDefaults.set(self.dataDic, forKey: "isHeadMasterPublishHomework")
    }

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-12-24 20:43  淡然微笑_Steven  阅读(432)  评论(0编辑  收藏  举报