4 ios swift_ios-swift4 - CSDN
  • IOS swift3.0 下闭包语法整理 一、闭包的概念 有oc基础的都知道,闭包其实是oc里面的block,语法格式不一样,但作用是一样的。主要是用于callBack(异步回调)或者两个类之间的通信。它的本质一个函数,一个可...

    http://www.jb51.net/article/97240.htm

    IOS swift3.0 下闭包语法整理

    一、闭包的概念

    有oc基础的都知道,闭包其实是oc里面的block,语法格式不一样,但作用是一样的。主要是用于callBack(异步回调)或者两个类之间的通信。它的本质一个函数,一个可执行的代码块,只是这个函数是没有名字的,也就是匿名函数。你也可以把他看作如 int、float一样,是一种数据类型,一种可以作为参数传递的数据类型。

    二、基本语法

    1、闭包的声明

     //定义一个求和闭包
        //闭包类型:(Int,Int)->(Int)
        let add:(Int,Int)->(Int) = {
          (a,b) in
          return a + b;
        }
       //执行闭包,相当于调用函数 
       let result = add(1100, 200);
        //打印闭包返回值
        print("result=\(result)");
    

    闭包类型是由参数返回值决定,如上述add闭包类型为(Int,Int)->(Int),箭头前面括号是参数类型,多个参数逗号隔开,箭头后面括号返回值类型。

    分析下上面代码,“=”左边的“ let add:(Int,Int)->(Int) ”意思是声明一个add常量,add是一个闭包类型,并且这个闭包的类型是:(Int,Int)->(Int)。

    “=”右边是一个代码块,即闭包的具体实现,相当于给左边add常量赋值。代码块的语法格式:

    {
        (参数1,参数2) in
        //code
     }
    

    参数和需执行的代码(code)用 关键字“in”隔开,如果闭包没有参数, “ () in”可以直接省略:

    {
      //code
     }
    

    你也可以用关键字“typealias”先声明一个闭包的数据类型

    import UIKit
    
    //声明一个闭包类型 AddBlock
    typealias AddBlock = (Int,Int)->(Int);
    
    class ViewController: UIViewController {
    
      override func viewDidLoad() {
        super.viewDidLoad()
        let add:AddBlock = {
          (a,b) in
          return a + b;
        }
    
       let result = add(1100, 200);
        print("result=\(result)");
     }
    }
    
    

    3、闭包的用法

    1、两个类之间的通信

    ios中类之间的通信方式有多种,常用的有:协议代理、通知,以及本章要讲的闭包。因为协议代理用起来比较麻烦,又是声明协议方法、又要设置代理的,代码步骤太多,我一般不用;通知一般用于两个完全没有关联的类通信,可以一对多,但解耦和的太厉害,我一般是特定的场合用。所以针对有关联的两个类之间的通信,我一般是用闭包或block的,这样比较简洁迅速。

    示例程序:监听控制器上一个自定义view按钮的点击


    界面效果

    CustomView类中代码

    class CustomView: UIView {
    
      //声明一个属性btnClickBlock,type为闭包可选类型
      //闭包类型:()->() ,无参数,无返回值
      var btnClickBlock:(()->())?;
    
      //重写 init(frame: CGRect)构造函数
      override init(frame: CGRect) {
        super.init(frame:frame);
        //创建按钮
        let btn = UIButton(frame: CGRect(x: 15, y: 15, width: 80, height: 32));
        btn.setTitle("按钮", for: .normal);
        btn.backgroundColor = UIColor.blue;
        //绑定事件
        btn.addTarget(self, action: #selector(CustomView.btnClick), for: .touchDown);
        //添加
        addSubview(btn);
    
      }
      //按钮点击事件函数
      func btnClick(){
    
        if self.btnClickBlock != nil {
          //点击按钮执行闭包
          //注意:属性btnClickBlock是可选类型,需要先解包
          self.btnClickBlock!();
        }
      }
    
      required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
      }
    
    }
    
    

    Controller类中代码:

    class ViewController: UIViewController {
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        //创建CustomView对象
        let cutomeView = CustomView(frame: CGRect(x: 50, y: 50, width: 200, height: 200));
        //给cutomeView的btnClickBlock闭包属性赋值
        cutomeView.btnClickBlock = {
          // () in 无参数可以省略
          //当按钮被点击时会执行此代码块
          print("按钮被点击");
        }
        cutomeView.backgroundColor = UIColor.yellow;
        //添加到控制器view上
        self.view.addSubview(cutomeView);
    
      }
    }
    
    

    2、异步回调(callBack)

    以发送一个简单的网络请求为例:

    /// 定义一个网络请求函数
      ///
      /// - parameter urlString: 请求接口  String
      /// - parameter succeed:  成功的回调 可选闭包
      /// - parameter failure:  失败的回调 可选闭包
      func requestData(urlString:String,succeed: ((Any?)->(Void))?,failure:((Any?)->(Void))?){
    
        let request = URLRequest(url: URL(string: urlString)!);
    
        //发送网络请求
        NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in
          if error == nil {
            //请求成功,执行成功的回调,并把数据传递出去
            succeed?(data);
          }else{
             //请求失败,执行失败的回调,并把错误传递出去
            failure?(error);
          }
        }
      }
    
    
    // 调用函数requestData函数
        requestData(urlString: "http://www.baidu.com", succeed: { (data) -> (Void) in
    
          //成功的回调
          guard let result = data as? Data else{
            return;
          }
    
          let srt = NSString(data: result, encoding: String.Encoding.utf8.rawValue);
    
          print(srt!)
    
    
          }) { (error) -> (Void) in
            //失败的的回调
            print(error);
        }
    
    

    四、闭包的一些特殊语法

    1、尾随闭包

    当闭包作为函数的最后一个参数时,可以省略前面的括号。尾随闭包没什么特殊的作用,纯粹是一种语法上的简洁,增加易读性。

    例:定义一个函数:

    //第二个参数:闭包 (String)->(Void)
    func post(url:String,succesce:(String)->Void) {
    
        print("发送请求");
    
        succesce("请求完成");
      }
    
    

    执行函数,正常写法:

     //正常写法,第二个参数,传递一个闭包
       post("http", succesce: {
          //闭包传递的参数
          (json) in
          //执行的代码
           print(json);
    
        });
    
    

    执行函数,尾随闭包写法:

    //尾随闭包,当闭包作为函数的最后一个参数时,可以省略前面的括号
     HttpTool.post("http") { (json) in
          print(json);
        };
    

    2、逃逸闭包

    看起来很“吊炸天”的一个名字,其实很简单。当闭包作为一个参数传递到函数时,我们知道它一般是用于函数内部的异步回调,闭包是等异步任务完成以后才调用,而函数是会很快执行完毕并返回的,所以闭包它需要逃逸,以便稍后的回调。

    逃逸闭包一般用于异步函数的回调,比如网络请求成功的回调和失败的回调。语法:在函数的闭包行参前加关键字“@escaping”。

    或许细心的人已经发现我上面的示例网络请求为什么没有出现关键字“@escaping”,你可以拉回去看下成功回调或失败的回调,类型是“((Any?)->(Void))?”,后面带了个“?”,这是闭包可选类型,并不是闭包类型,所以无需关键字“@escaping”。

    假设成功和失败的回调要弄成闭包类型,而你又要异步使用的话,那就要在形参前面加关键字,如下:

     /// 定义一个网络请求函数
      ///
      /// - parameter urlString: 请求接口  String
      /// - parameter succeed: 成功的回调 闭包 因需要异步使用,前面加关键字@escaping修饰,指明其为逃逸闭包
      /// - parameter failure: 失败的回调 闭包 因需要异步使用,前面加关键字@escaping修饰,指明其为逃逸闭包
      func requestData(urlString:String,succeed: @escaping (Any?)->(Void),failure:@escaping (Any?)->(Void)){
    
        let request = URLRequest(url: URL(string: urlString)!);
    
        //发送网络请求
        NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in
          if error == nil {
            //请求成功,执行成功的回调,并把数据传递出去
            succeed(data);
          }else{
             //请求失败,执行失败的回调,并把错误传递出去
            failure(error);
          }
        }
      }
    
    

    假设成功和失败的回调要弄成闭包类型,而你又要异步使用的话,但你又不想在形参前面加关键字,那对不起,我也没有办法,编译直接报错!


    展开全文
  • iOS Swift字符串截取

    2017-02-22 11:17:25
    Swift的字符串截取由三种方式下面我们一次介绍 方式一 根据index进行简单截取 // 声明一个字符串 Swift中字符串的类型是String类型 var strTest = "01224312" // 得到第一个字符的index var index = strTest....

    Swift的字符串截取由三种方式下面我们一次介绍
    方式一 根据index进行简单截取

    // 声明一个字符串 Swift中字符串的类型是String类型
    var strTest = "01224312"
    // 得到第一个字符的index
    var index = strTest.dstartIndex
    // 得到最后一个字符的index
    var index_end = strTest.endIndex
    // 前一个位置predecessor
    var index_p1 = index_end.predecessor()
    // 后一个位置successor()
    var index_s1 = index.successor().predecessor()
    // 根据index进行截取 前一个和后一个可以套用 适合小范围的截取
    var subString = strTest.substringFromIndex(index_s1)
    

    方式二:转成NSString类型后进行截取

    var strTest = "01224312"
    // 将String转成NSString类型
    // 使用as 关键字指定目标类型
    var nsstr1 = (strTest as NSString).substringFromIndex(5)
    // 这样就可以灵活的进行截取

    方式三:使用advancedBy()进行截取

    // 声明一个字符串
    var strTest2 = "01234567"
    // 通过advancedBy()方法得到位置进行截取
    let index_str2 = strTest2.startIndex.advancedBy(3)
    var subStrTest2 = strTest2.substringToIndex(index_str2)
    // 也可以调用下面的方法截取中间截取
    strTest.substringWithRange(<#T##aRange: Range<Index>##Range<Index>#>)
    展开全文
  • 1. NSNotification : 一个对象状态变化时通过NSNotification通知另一个或多个对象 (观察者模式 Observer); 2. 发送通知: ... NSNotificationCenter.defaultCenter().postNotificationName("Name", ...

    1. NSNotification : 一个对象状态变化时通过NSNotification通知另一个或多个对象 (观察者模式 Observer);

    2. 发送通知:


      let dic = myvalue 

      NSNotificationCenter.defaultCenter().postNotificationName("Name", object: dic)


    3. 接收通知:


      NSNotificationCenter.defaultCenter().addObserver(self, selector: "Myfunc:", name: "Name", object: nil)

      func Myfunc(notification: NSNotification) {

            

            let getStr = notification.object as! String //这里以通知内容为字符串类型为例

            print("收到通知"+getStr)

        }


    4.移除通知:


      deinit{

            NSNotificationCenter.defaultCenter().removeObserver(self)

            }


    /*

    持续完善更新中...

    */



               


    展开全文
  • 新建Swift文件和xib文件 Swift 文件 xib文件 (名字与Swift文件相同) Swift文件中的代码import UIKit class LXFView: UIView { // MARK:- 创建视图 class func newInstance() -> LXFView? { let nibView = ...

    新建Swift文件和xib文件

    1. Swift 文件
      这里写图片描述
      这里写图片描述
    2. xib文件 (名字与Swift文件相同)
      这里写图片描述
      这里写图片描述

    Swift文件中的代码

    import UIKit
    class LXFView: UIView {
        // MARK:- 创建视图
        class func newInstance() -> LXFView? {
            let nibView = Bundle.main.loadNibNamed("LXFView", owner: nil, options: nil);
            if let view = nibView?.first as? LXFView {
                return view
            }
            return nil
        }
    }

    Controller中使用

    if let lxfView = LXFView.newInstance() {
        view.addSubview(LXFView)
    }
    展开全文
  • iOS Swift3.0 UIView动画详解iOS Swift30 UIView动画详解 缩放动画 旋转动画 透明度动画 在IOS开发中为了做一些比较炫的效果有时候免不了使用动画。虽然苹果自带了CoreAnimation和Facebook的Pop等动画框架,这些的确...
  • iOS Swift3.0异步裁切任意弧度高性能圆角图片
  • ios swift 多个界面,viewcontroller应该怎么写呢?或者说怎么控制?不用storyboard
  • ios8以后是用UIAlertController来代替UIAlertView(在屏幕中间弹出)和UIActionSheet(显示在屏幕底部的弹出框) //定义一个UIActionSheet let ActionSheet = UIAlertController(title: "标题", message: "信息", ...
  • 从学IOS开始到现在已经半年了,也独立做过两个项目,都是涉及蓝牙方面的通信. 在我开发过程中遇到一些问题,然后寻找到的解决方案分享给大家也是开年的第一篇希望能过帮助大家。在我们开发程序过程中不可能都理所当然...
  • ios_swift开发资源整理

    2015-08-12 20:24:33
    iOS Swift开发资源整理 文档管理者:PMST 当前版本:V1.1.0 最后更新日期:2015.06.28(ps:这兴起事情有点多更新有点少) 注:[New]表示更新内容,此外有优秀文章、资源、框架等等,都可以推荐给我,发送到我的...
  • 文章转载自我的个人博客原文链接自言自语: 亿万千百十, 皆起于一资料1 —...Github上的地址点我Using Swift with Cocoa and Objective-CWWDC 2015 系统化的开发文档iOS Developer LibrarySwift 开源及跨平台开发swift
  • IOS Swift 获取屏幕大小

    2016-06-02 22:18:14
    let yourView:UIView = UIView.init(frame:UIScreen.mainScreen().bounds)    let yourFrame = UIScreen.mainScreen().bounds
  • iOS指纹解锁Swift

    2017-06-14 15:53:45
    iOS指纹解锁 Swift,几行代码就搞定
  • iOS swift 用storyboard拖出的控件,给控件添加跳转事件,跳转会出现黑屏。例如 @IBAction func ChangePassWord(sender: UIButton) { var vc=ChangePassWordViewController() self.presentViewController(vc, ...
  • 正在学习swift的Core Data,做个笔记,顺便分享源码 这个实例是一个很简单的Table,通过右上角的Add按钮可以添加新的用户名。数据存储在CoreData中,这样,才不会丢失。 通过这个例子可以学会: 使用Xcode的model...
  • 最近突然对动画特别感兴趣,尤其是最常见的加载动画,百度了一圈发现全是OC代码,这让我这个习惯写swift的假iOS开发很是郁闷。在网上扒的过程中看到一个挺简单的一个加载动画,看了一下原作者的代码,学习了一下原...
  • OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在...
  • 苹果在2014年WWDC(苹果开发者大会)发布了Swift,用于编写iOS,Mac OS X和watchOS应用程序。Swift 采用安全的编程模式并添加了很多新特性,而且对于熟悉OC人开发者来说学习Swift也很简单。是不是已经迫不及待要体验...
  • iosswift教程

    2019-06-13 20:38:23
    学习swift地址 https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html 在wwdc2019上看到了苹果公司关于swiftui的介绍,感觉这就是未来。 Swift编程语言简介 Swift命令行操作 Swift defines away large ...
  • 在使用折线图时,一直无法把x轴的文字放上去,最后...http://stackoverflow.com/questions/40756944/ios-swift-charts3-0how-to-add-xvals In Charts2.3 We can use the follow code to add data. code: let c
1 2 3 4 5 ... 20
收藏数 65,336
精华内容 26,134
关键字:

4 ios swift