swift学习笔记《3》-技巧

1.swift打印

  • 自定义printLog
    func printLog<T>(message : T, fileName : String = __FILE__, lineNum : Int = __LINE__) {
    
        #if DEBUG
        // 处理fileName
        let file = (fileName as NSString).lastPathComponent
        print("\(file):[\(lineNum)]")
        #endif
    }
    复制代码

2.获取命名空间

  • let nas = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String

3.try 的三种方式

  • JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions)函数会抛出异常

  • throws 需要用try 获取

  • try 需要用do catch 错误放在catch 中的error中

    do { 
    let aaa = try  JSONObjectWithData()
    }catch{ 
        print(\(error)) 
    }
    复制代码
  • try? 如果没有值,返回nil 返回值是可选类型

  • try!相当于告诉系统一定没有异常,发生异常会崩溃

4.storyBoard Refrence

  • 方式1

  • 选中需要的控制器

  • 选择导航条的editor

  • 选择下拉菜单 refector to sroryboard

  • 方式2

  • 在控件库中拖入storyboard refrence

  • 新建一个storyboard

  • 点击storyboard refrence 关联到建立的storyboard,

  • 原来的控件中就可以与 storyboard refrence 连线跳转

5.swift封装 AFN

  • 设置网络工具枚举 POST,GET
    enum RequestMothod:String {
    case POST = "POST"
    case GET = "GET"
    }
    复制代码
  • 封装网络请求单例类
    class NetworkTools : AFHTTPSessionManager {
        static let  shareTools : NetworkTools = {
            let  tools =  NetworkTools()
            tools.responseSerializer.acceptableContentTypes?.insert("text/plain")
            return tools
        }
    }
    复制代码
  • AFN 内部方法的封装
  • 封装POST,GET 用一个方法封装
  • 使用关键字 typealias 设置方法的block ,参数是返回值,错误信息,返回值是空(rest:Any,error:Error )->()
  • 定义方法中的参数,type ,urlstring ,pramas, 上面的回调的block
  • 在方法中定义成功的闭包,失败的闭包,用于传进AFN的方法参数,
    // 内部封装AFN 请求
    
    extension AFNNetWorkTool {
    
        //typealias callBack = (_ aresult:AnyObject?,_ erro:Error)->()
        func afnRequest(methodType:AFNnetRequsetType,urlString:String,parames:[String:AnyObject]?,finished:@escaping (_ result:Any?,_ error:Error?)->()){
            // 定义成功的回调
            let seccessBlck = { (task:URLSessionDataTask,resuurt:Any?)->() in
                finished(resuurt,nil)
            }
    
            // 定义失败的回调
            let faitureBlock = { (tast:URLSessionDataTask?,error:Error)->() in
                finished (tast,error)
            }
    
            if methodType == .GET {
                get(urlString, parameters: parames, progress: nil, success: seccessBlck, failure: faitureBlock)
    
            }else{
                post(urlString, parameters: parames, progress: nil, success: seccessBlck, failure: faitureBlock)
    
            }
        }
    }
    复制代码

6 Alamofire 监测网络

  • 使用alamofire 监测网络状况
    let NetworkManager = NetworkReachabilityManager(host: "www.baidu.com")
    NetworkManager!.listener = { status in
        print("") 
        switch status {
            case .NotReachable: 
                print("")  
            case .Unknown:  
                print("")  
            case .Reachable(.EthernetOrWiFi): 
                print("") 
            case .Reachable(.WWAN):  
                print("")  
        }  
    }
    NetworkManager!.startListening() 
    复制代码

7.UIWebView 自动填充账户密码

  • 每次输入网页需要填充账户名密码十分麻烦,结合safari开模拟查看网页上标签
    let js = "document.getElementById('userId').value = '1606020376@qq.com';" +
        "document.getElementById('passwd').value = 'haomage';"
        webView.stringByEvaluatingJavaScriptFromString(js)
    复制代码

8.双击底部tabbarItem刷新数据

  • 判断索引是当前,并且将要点击是当前

  • 让滑倒顶部

  • 刷新数据,延迟加载

  • 清除角标

    let index = childViewControllers.index(of: viewController)
    if selectedIndex == 0 && selectedIndex == index{
        let nav  = childViewControllers[0] as! UINavigationController
        let vc = nav.childViewControllers[0] as! HomeVC
        vc.tableView?.setContentOffset(CGPoint(x: 0, y: -64), animated: true)
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1 , execute: {
            vc.loadData()
        })
        vc.tabBarItem.badgeValue = nil
        UIApplication.shared.applicationIconBadgeNumber = 0
    }
    复制代码

9. 毛玻璃 - 高斯模糊

  • Vleual Effect View 选择,extra Light 就可以

  • 子视图添加在View上,并且不透明

10.POP 基本概念

  • 支持3种动画类型
    • 弹力动画POPSPringAnimation
    • 衰减动画 POPDelayAnimation
    • 基本动画 POPBasicAnimation
  • 如果需要做延时动画需要如下代码
    // 5秒之后的延迟
    anim.beginTime = CACurrentMediaTime( ) + CFTimeInterval ( 5)
    复制代码

11.Block 的延时执行,需要的时候再执行

  • 当前方法不能执行,使用属性记录,在需要的时候再执行
    // 定义一个属性,是可选的闭包,
    // 闭包有参数无返回值 
    private var comlentionBlock:( (clasName:String? ) -> ( ) )?
    复制代码
  • 当属性引用闭包,闭包右修改了属性,必发生循环引用,在闭包中使用【weak self】

12.单例方法严谨

  • 单例如果调用了init方法,和share方法,得到的是不同的对象,

  • init 用private 修饰,外部只能使用share 方法

    static let share = CZEmotionManager()
    private init() {
        loadPackAges()
    }
    复制代码

13.加载bundle中的图片素材

  • 通过mainBundle,找到素材bundle

  • 找到素材plist的path,plist转为数组

    guard let path  = Bundle.main.path(forResource: "HHEmotion.bundle", ofType: nil),
                let bundle  = Bundle(path: path) ,
                let plistpath = bundle.path(forResource: "emotion.plist", ofType: nil),
                let arry  = NSArray(contentsOfFile: plistpath) as? [[String:String]] else {
                return
            }
    print("\(arry)")
    复制代码

14.过滤数组 - 尾随闭包的简单写法

  • OC 中过滤数组,使用谓词
  • swift 中,过滤使用filter, P是数组,判断数组中的模型的一个属性的值是不是相等
    • 直接过滤

    • 尾随闭包:

    • 如果是尾随闭包只有一句,并且是返回,闭包格式可以省略,参数省略之后,可以使用0,1….以此替代原有的参数

    • return 也可以省略

15.测试正则表达式

  • 匹配中间带【】的字符,任何字符都行

  • 字符中 【】() 是正则表达式的关键字,如果参与匹配,需要转义

  • 匹配所有项

  • for循环所有项,根据所有项所在的range,匹配出字符串

16.图片拉伸处理

  • 根据图片的size,设置拉伸的rect
  • 拉伸图片
    var image = UIImage(named: "ceshiimage")
    let size  = image?.size ?? CGSize()
    let inset = UIEdgeInsetsMake(size.height*0.5, size.width*0.5, size.height*0.5, size.width*0.5)
    image = image?.resizableImage(withCapInsets: inset)
    复制代码

17.UIColor 16进制转RGB

  • 写分类
  • 根据16进制 位运算,有移得出相对应的RGB的数值
  • 生成颜色
    static func jy_colorWithHex(hex:u_int)->UIColor{
    
        let red = Float((hex & 0xFF0000) >> 16)
    
        let green = Float((hex & 0x00FF00) >> 8)
    
        let blue = Float(hex & 0x0000FF)
    
        return UIColor.init(colorLiteralRed: red/255.0, green: green/255.0, blue: blue/255.0, alpha: 1.0);   
    
    }
    复制代码

转载于:https://juejin.im/post/5b8f9bbce51d450e425e81da

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值