Swift之“闭包”的应用

相信了解swift的,都应该知道,swift舍弃了OC中的block,但是block的应用又比较灵活,作用也很强大。swift中当然不能缺少这样的设计模式,于是推出了闭包,其功能和作用与OC的block有着异曲同工之妙,但是在写法上,差距比较大。本文,主要是来一探“闭包”的使用方法。

一:闭包简介

1,闭包也是一个函数,函数是什么?函数就是一段代码块。这个没有什么可纠结的。
2,闭包的使用方法,闭包主要有两种使用方法,1),闭包在方法中的应用。2),闭包在属性中的应用。

二:闭包的结构分析

  mathFunction:(text:String) -> Void

mathFunction是闭包的名字(名字后面必须跟冒号)
()小括号里面的是参数
text是参数名
String是参数类型
->指向意思,其后面表示的就是返回值类型了
注:如果是要带多个参数的话,其格式为(参数:参数类型 , 参数:参数类型)中间用逗号隔开。

三:闭包在方法的应用

方式1:
直接在方法中插入闭包

  /**闭包在方法中应用*/
  func dataBack(str:String , mathFunction:(text:String) -> Void){

       print("\(str)");
      mathFunction(text: "这是闭包在方法中的应用");
  }

这种定义方式,其带了两个参数,一个是Sting类型的,一个就是闭包,只不过闭包比较特殊,你可以理解为参数,也可以有其它理解。

    mathFunction(text: "这是闭包在方法中的应用");

这句代码是调用闭包,此代码中,是在方法里面调用了闭包,也就是在调用这个方法时,闭包也会被自动调用。如果你想在其它地方调用闭包,这时候就用到属性了,在这里就先不说了,在方式二中,我会讲到。

方式2:使用typealias定义闭包,放到方法和属性中。

其相当于别名的作用了,先定义一个别名为newFuncy的闭包
typealias newFuncy = (text : NSString) -> Void;

定义一个myFuncy属性,其类型为newFuncy,其作用会在下面讲到
var myFuncy:newFuncy?;

/**闭包在方法中第二种应用*/
func secondDataBack(str:String , mathFunction:newFuncy){

    print("\(str)");
    self.myFuncy = mathFunction;
}

这是使用typealias定义的闭包,在方式一中,我是在方法中直接调用闭包,在这里,就是我要讲的是,如果你想在其他地方,调用闭包的话,这时,你在方法中,将方法带有的闭包,赋值给你自己定义的属性闭包,在你想要调用闭包的地方,调用这个属性就可以了。相信这点大家都能理解吧!如果有不理解的,可以随时提问。

四:属性闭包的使用

如果上面的方式,大家觉得比较繁琐,想像block一样,在属性中简单灵活的运用,在这里,我告诉大家,是可以的。

首先定义一个闭包属性(当然你也可以采用typealias的方式来定义)

//闭包的属性的用法
var my:((text : NSString) -> Void)?;

我们都知道block定义成属性时,我们可以直接用他的set方法,这样,在block被调用时,其set方法内部的代码就会执行,但是闭包的,可以用set方法吗?swift中,set方法写起来也比较费劲,而且这样定义的属性,不能直接调用set方法吧?

笔者在探究过程中,是没有成功的写出它的set方法,如果有写出来的,希望你能在评论中加上,定当感激不尽。

来看一看,我自己探索出来的写法吧!

//利用闭包属性传递消息,注意,此代码不能写在与属性闭包定义的同一个类里,   会崩溃,具体崩溃原因,正在思考。
    viewC!.my = { (text) -> Void in
        self.str = "sss";
        print(text);
    }

这是笔者自己探究出来的一种写法,这样在调用闭包时,in后代码就会执行。里面的注意,相信大家也都看到了,有兴趣的可以去尝试下,笔者目前猜测,崩溃原因与“视图构造器”有关。如果有大神,能给出详细的解释,笔者跪谢啊。

最后一点,也是很多初学者经常容易忘得了,那就是在属性闭包调用时,要加一个判断,加什么判断呢?----->判断闭包是否存在。 为什么加判断呢?---->为了使逻辑更严谨,代码更安全。

  if((self.my) != nil){
      my!(text:"这是闭包在属性中的应用");
    }

判断方式,类似上面的代码。

五:闭包中类似block的引用计数增加的探究

首先定义两个属性,其实两个可以说成一个。

var str:NSString?;

var _str:NSString{

    set{
        str = newValue;
    }

    get{
        return str!;
    }
}

然后在属性闭包,和方法闭包中分别给这两个属性赋值。

viewC!.my = { (text) -> Void in

        self.str = "sss";
        self._str = "ssss"
    }

viewC?.dataBack("传给带闭包的方法的参数", mathFunction: { (text) -> Void in

        self.str = text;
        self._str = "ssss"
    });

通过探究发现,笔者的这两种闭包的写法,在其内部使用全局变量,是不会有黄色警告的,也就是说,没有对变量进行引用计数+1。说到这里,笔者突然想到一个问题,swift也是采用ARC来管理内存的吗?有空得去查下资料,这是因为笔者在写简书时,突然想到的,所以等笔者查完以后,在其它文章里写这些吧。

如果在做的诸位开发者,有不同的理解和见解,欢迎大家和我一起讨论。技术群512847147

时间: 2024-10-06 08:29:41

Swift之“闭包”的应用的相关文章

swift 深入理解Swift的闭包

我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: var str:String={ return "JobDeer" }() 闭包还可以这么定义,省略了等号和括号: var str:String{ return "JobDeer" } 闭包中可以定义get方法. var str:String{ get{ return

Swift:闭包

一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Are Reference Types) 闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的

Swift使用闭包表达式

Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in    语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字.Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式.1.类型推断简化类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型.以下代码是标准形式的闭包:{(a:Int, b:Int) -> Int in    return a + b}Swift

Swift学习--闭包的简单使用(三)

一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿名函数 闭包是用来定义函数 作用:Block是用于保存一段点,在需要的时候执行 闭包也是用于保存一段点,在需要的时候执行做一个耗时操作 */ /** 闭包的基本格式: { (形参列表)->() in 需要执行的代码 } */ /** * 闭包的几种格式: 1.将闭包通过实参传递给函数 2.如果闭包是

Swift函数闭包

一.闭包的概念 计算机语言要支持闭包的前提条件有2个: 1.支持函数类型,能够将函数作为参数或返回值传递: 2.支持函数嵌套 示例: func caculate(opr : String)->(Int,Int)->Int { var result:(Int,Int)->Int switch(opr){ case "+": result={(a:Int,b:Int)->Int in return a+b } default: result = {(a:Int,b:

Swift:闭包(Closures)

一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, javascript中的函数嵌套等类似. 闭包能够捕获和存储上下文中定义的的不论什么常量和变量的引用. 这就是所谓的变量和变量的自封闭, 因此闭包还会处理全部捕获的引用的内存管理. 全局函数和嵌套函数事实上就是特殊的闭包. 闭包的形式有: (1)全局函数都是闭包.有名字但不能捕获不论什么值. (2)嵌套函数

Swift的闭包(二):捕获值

闭包可以从定义它的上下文中捕获常量和变量. 在Swift中,捕获值最简单的例子是嵌套函数,举个例子: 1 func makeIncrementer(forIncrement amount: Int) -> () -> Int { 2 var runningTotal = 0 3 func incrementer() -> Int { 4 runningTotal += amount 5 return runningTotal 6 } 7 return incrementer 8 } 在这

4 .Swift函数|闭包

在编程中,我们常把能完成某一特定功能的一组代码,并且带有名字标记类型叫做函数,在C语言中,我们知道函数名就是一个指针,它指向了函数体内代码区的第一行代码的地址,在swift中也具有同样的功效. 在Swift中函数的表现形式如下: 1. func 函数名(参数名1:参数类型,参数名2,参数类型)->返回值类型 {函数的实现部分} func sayHello()->Void { print("hello world") } //有参数,有返回值, func sayHello2(

【Swift】闭包(Closures)

闭包表达式(Closure Expressions) 嵌套函数 是一个在较复杂函数中方便进行命名和定义自包含代码模块的方式.当然,有时候撰写小巧的没有完整定义和命名的类函数结构也是很有用处的,尤其是在您处理一些函数并需要将另外一些函数作为该函数的参数时. 闭包表达式是一种利用简洁语法构建内联闭包的方式. 闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了. 下面闭包表达式的例子通过使用几次迭代展示了sort(_:)方法定义和语法优化的方式. 每一次迭代都用更简洁的方式描述了相同的功能. so

关于Swift的闭包(closure)以及其在可选(Optional)类型中的应用

对于新手(如笔者)来说,闭包是Swift语言特性中很难理解的一部分.其原因可能有一部分在于一些人把复杂的函数写得很简单,新手会看不懂.闭包可以理解为把函数当做一个变量来看待.既然是变量,那么就自然可以作为参数传递给其它的函数.也就是说,实际上是把一个函数传递给了另一个函数.本文将详解闭包以及其在Optional型中的应用. 我们知道Swift采用了一种非常安全的称之为Optional的类型.这个Optional类型只可能有两种状态,一种是“什么都没有”(nil),另一种是“有什么东西”,只有这两