Swift学习之路03-基础,闭包

前端之家收集整理的这篇文章主要介绍了Swift学习之路03-基础,闭包前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

基础变量

  • let 常量 var变量
  • 类型标注 var welcomeMessage: String

数值

  • 一个十进制数字,没有前缀
  • 一个二进制数,前缀是 0b
  • 一个八进制数,前缀是 0o
  • 一个十六进制数,前缀是 0x
let@H_502_31@ decimalInteger = 17@H_502_31@ 
let@H_502_31@ binaryInteger = 0@H_502_31@b10001 
let@H_502_31@ octalInteger = 0@H_502_31@o21 // 八进制的17@H_502_31@
let@H_502_31@ hexadecimalInteger = 0x11@H_502_31@ // 十六进制的17@H_502_31@

元组

  • 元组(tuples)把多个值组合成一个复合值。元组的值可以是任意类型,并不要求是相同类型
let http404Error = (404@H_502_31@,"Not Fount"@H_502_31@)
//你也可以讲一个元组的内容分解(decompose)成单独的常亮@H_502_31@
let (statusCode,statusMessage) = http404Error
print@H_502_31@("The status code is \(statusCode)"@H_502_31@)
print@H_502_31@("The status message is \(statusMessage)"@H_502_31@)
//如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:@H_502_31@
let (justTheStatusCode,_) = http404Error
print@H_502_31@("The status code is \(justTheStatusCode)"@H_502_31@)
//你也可以用下标表示@H_502_31@
print@H_502_31@("The status code is \(http404Error.0)"@H_502_31@)
// 输出 "The status code is 404"@H_502_31@
print@H_502_31@("The status message is \(http404Error.1)"@H_502_31@) // 输出 "The status message is Not Found"@H_502_31@
//定义元组给每个元素定义名字@H_502_31@
let http200Status = (statusCode: 200@H_502_31@,description: "OK"@H_502_31@)
//通过元素名访问元素值@H_502_31@
print@H_502_31@("The status code is \(http200Status.statusCode)"@H_502_31@)

可选类型

  • 使用可选链(optionals)来处理值可能缺失的情况
//声明一个变量@H_502_31@
var text@H_502_31@: String
print@H_502_31@(text@H_502_31@) //报错因为text没用值所以会抱错@H_502_31@
var text@H_502_31@: String?
print@H_502_31@(text@H_502_31@) //打印nil@H_502_31@

Swift的nil和Objectivie-C的nil并不一样。在OC中,nil代表一个指向不存在的对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型

当你确定可选类型确实包含值之后,你可以再可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示”我知道这个可选有值,请使用它。”这被称为可选值的强制解析

断言

  • 在某些情况下,如果值缺失或者值并不满足特定条件,你的代码可能没办法执行。这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到缺失的原因。
let@H_502_31@ age = -3@H_502_31@
assert@H_502_31@(age >= 3@H_502_31@,"A person's age cannot be less than zero"@H_502_31@) //因为age < 0,所以断言会触发@H_502_31@
assert@H_502_31@(age >= 3@H_502_31@) //断言也可以省略信息@H_502_31@

注意
代码使用优化编译的时候,断言将被禁用,例如Xcode中,使用默认的target Release配置选项来build时,断言将被禁用

函数

  • 多重返回函数–返回一个元组
  • 使用函数类型,在Swift中,使用函数类型就像使用其他类型一样。例如,你可以定义一个类型为函数的常亮或变量,并将适当的函数赋值给他
var@H_502_31@ mathFunction@H_502_31@: (Int,Int)@H_502_31@ ->@H_502_31@ Int = addTwoInts
print@H_502_31@("Result: \(mathFunction(2,3))"@H_502_31@)
  • 函数类型作为参数类型
func printMathResult(mathFunction: (Int,Int) -> Int,_ a: Int,_ b: Int)@H_502_31@ { print@H_502_31@("Result: \(mathFunction(a,b))"@H_502_31@)@H_502_31@ } printMathResult@H_502_31@(addTwoInts,3@H_502_31@,5@H_502_31@)@H_502_31@ // prints@H_502_31@ "Result@H_502_31@: 8"@H_502_31@
  • 函数类型作为返回类型(Function Types as Return Types)
func stepForward(input: Int)@H_502_31@ ->@H_502_31@ Int {
    return@H_502_31@ input + 1@H_502_31@
}
func stepBackward(input: Int)@H_502_31@ ->@H_502_31@ Int {
    return@H_502_31@ input - 1@H_502_31@
}

//@H_502_31@ 根据传入的bool值来返回指定的函数
func chooseStepFunction(backwards: Bool)@H_502_31@ ->@H_502_31@ (Int)@H_502_31@ ->@H_502_31@ Int {
    return@H_502_31@ backwards ? stepBackward : stepForward
}

var@H_502_31@ currentValue = 3@H_502_31@
let@H_502_31@ moveNearerToZero = chooseStepFunction(currentValue > 0@H_502_31@)
//@H_502_31@ moveNearerToZero now refers to the stepBackward() function@H_502_31@
func chooseStepFunction(backwards: Bool)@H_502_31@ ->@H_502_31@ (Int)@H_502_31@ ->@H_502_31@ Int {
    func stepForward(input: Int)@H_502_31@ ->@H_502_31@ Int { return@H_502_31@ input + 1@H_502_31@ }
    func stepBackward(input: Int)@H_502_31@ ->@H_502_31@ Int { return@H_502_31@ input - 1@H_502_31@ }
    return@H_502_31@ backwards ? stepBackward : stepForward
}
var@H_502_31@ currentValue = -4@H_502_31@
let@H_502_31@ moveNearerToZero = chooseStepFunction(currentValue > 0@H_502_31@)
//@H_502_31@ moveNearerToZero now refers to the nested stepForward() function@H_502_31@
while@H_502_31@ currentValue != 0@H_502_31@ {
    print@H_502_31@("\(currentValue)... "@H_502_31@)
    currentValue = moveNearerToZero(currentValue)
}
print@H_502_31@("zero!"@H_502_31@)
//@H_502_31@ -4.@H_502_31@..
//@H_502_31@ -3.@H_502_31@..
//@H_502_31@ -2.@H_502_31@..
//@H_502_31@ -1.@H_502_31@..
//@H_502_31@ zero!

闭包

  • Swift 标准库提供了名为 sort 的方法,会根据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。一 旦排序完成,sort( _ :) 方法会返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。原数组 不会被 sort( _ :) 方法修改
    下面的闭包表达式示例使用 sort( _ :) 方法对一个 String 类型的数组进行字母逆序排序.
func compare(a: Int,b: Int)@H_502_31@ ->@H_502_31@Bool {
    return@H_502_31@ a > b
}
var@H_502_31@ newArray = array.sort(compare)
var@H_502_31@ newArray = array.sort { (a,b)@H_502_31@ ->@H_502_31@ Bool in@H_502_31@
    return@H_502_31@ a > b
}
print@H_502_31@(newArray.description)
// 我自己写的sort方法@H_502_31@
class@H_502_31@ SwiftClosure@H_502_31@ {@H_502_31@
    // 定义一个闭包@H_502_31@
    static@H_502_31@ func sort(array@H_502_31@: Array@H_502_31@<Int>,@noescape function@H_502_31@:(a: Int,b: Int)@H_502_31@ -> Bool@H_502_31@) -> Array@H_502_31@<Int@H_502_31@> {@H_502_31@
        var@H_502_31@ newArray: Array@H_502_31@<Int>
        newArray = []
        for@H_502_31@ i in 0.@H_502_31@..array@H_502_31@.count - 1@H_502_31@ {
            if@H_502_31@ newArray.count == 0@H_502_31@ {
                newArray.append(array@H_502_31@[i])
                continue@H_502_31@
            }
            for@H_502_31@ j in 0.@H_502_31@..newArray.count - 1@H_502_31@  {
                if@H_502_31@ function@H_502_31@(a:array[i],b: newArray[j])@H_502_31@ {@H_502_31@
                    newArray.insert(array@H_502_31@[i],atIndex: j)
                    break@H_502_31@
                } else@H_502_31@ {
                    newArray.append(array@H_502_31@[i])
                    break@H_502_31@
                }
            }
        }
        return@H_502_31@ newArray
    }
}
//@H_502_31@  外部调用
    override func viewDidLoad() {
        super@H_502_31@.viewDidLoad()
        //@H_502_31@ Do any additional setup after loading the view,typically from a nib.
        var@H_502_31@ array@H_502_31@:[Int] = [5@H_502_31@,5@H_502_31@,2@H_502_31@,6@H_502_31@,1@H_502_31@]
        array = SwiftClosure.sort(array)@H_502_31@ { (a,b)@H_502_31@ ->@H_502_31@ Bool in@H_502_31@
            return@H_502_31@ a > b
        }
        print@H_502_31@(array.description)
        //@H_502_31@ print@H_502_31@ [6@H_502_31@,1@H_502_31@]
    }
  • 闭包是引用类型,这意味着如果您将闭包赋值给了两个不同的常量或者变量,两个值都会指向同一个闭包
  • 非逃逸闭包,当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。当你定义接受闭包作为参数的函数时,你可以在参数名之前标注 @noescape,用来指明这个闭包是不允许“逃 逸”出这个函数的。将闭包标注 @noescape 能使编译器知道这个闭包的生命周期(译者注:闭包只能在函数体中 被执行,不能脱离函数体执行,所以编译器明确知道运行时的上下文),从而可以进行一些比较激进的优化。
func someFunctionWithNoescapeClosure(@noescape@H_502_31@ closure: () -> Void)@H_502_31@ { closure@H_502_31@()@H_502_31@ }@H_502_31@

  • block闭包 block可以在外部定义方法,然后内部调用获取某些值,也可以将某些值返回给外部,block需要在类名前用typealias给方法重新命名
typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。使用的语法也很简单,使用 typealias 关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为新的名字
import@H_502_31@ Foundation

//@H_502_31@ 包含Block的类
typealias funcBlock@H_502_31@ = (Array<Int>)@H_502_31@ ->@H_502_31@ ()@H_502_31@ //或者 ()@H_502_31@ ->@H_502_31@ Void

class@H_502_31@ SwiftClosure@H_502_31@ {@H_502_31@

    var@H_502_31@ blockD@H_502_31@: funcBlock?
    var@H_502_31@ newArray@H_502_31@: Array<Int> = []

    //@H_502_31@ 定义一个闭包
    func sort(array: Array<Int>,@noescape@H_502_31@ function@H_502_31@:(a: Int,b: Int) -> Bool,block: funcBlock)@H_502_31@ ->@H_502_31@ Void {
        newArray = []
        for@H_502_31@ i in@H_502_31@ 0.@H_502_31@..array.count - 1@H_502_31@ {
            if@H_502_31@ newArray.count == 0@H_502_31@ {
                newArray.append(array[i])
                continue@H_502_31@
            }
            for@H_502_31@ j in@H_502_31@ 0.@H_502_31@..newArray.count - 1@H_502_31@  {
                if@H_502_31@ function@H_502_31@(a@H_502_31@:array[i],b@H_502_31@: newArray[j]) {
                    newArray.insert(array[i],atIndex@H_502_31@: j)
                    break@H_502_31@
                } else@H_502_31@ {
                    newArray.append(array[i])
                    break@H_502_31@
                }
            }
        }
        blockD = block
    }

    func getNewArray()@H_502_31@->@H_502_31@Void {
        blockD!(newArray)
    }
}
// 调用含有Block的类@H_502_31@
import UIKit

class@H_502_31@ ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view,typically from a nib.@H_502_31@
        let@H_502_31@ array:[Int] = [5@H_502_31@,1@H_502_31@]
        let@H_502_31@ swiftClosure = SwiftClosure()
        swiftClosure.sort(array,function@H_502_31@: {@H_502_31@ (a,b) -> Bool in@H_502_31@
            return@H_502_31@ a > b
            }) { (newArray) -> () in@H_502_31@
                print(newArray)
        }
        swiftClosure.getNewArray() // 调用这句话后控制台打印[6,5,2,1]@H_502_31@
    }
}

我日了,写Swift写的不会写OC了!!!WTF

我日了,在Xcode中Swift跟OC一比,完全是Xcode不支持Swift啊!!!WTF

猜你在找的Swift相关文章