当前位置: 首页>移动开发>正文

swiftui LinearGradient使用 swift function builder

swift的函数式编程比较灵活,主要有函数,闭包(objective-c中的block),协议,扩展,泛型,可空链等等,下面就逐个解释。

一:函数

函数是函数式编程的基础和一部分,函数类似于其他的语言,例如Java,objective-c,都是由函数名,参数,返回值,函数体组成,只是在写法上有细微的区别。

1.1函数的定义

func isInclude(isInclude:String,inArray:Array<String>)->Bool{//函数定义
    
    for item in inArray{
        
        if isInclude == item{
            
            return true
        }
    }
    
    return false
}
isInclude("0", inArray: ["1","2","3"])

1.2外部参数名(即在调用函数的时候,显示参数名)

func isInclude(target isInclude:String,strings inArray:Array<String?>)->Bool{
    
    for item in inArray{
        
        if item == isInclude{
            
            return true
        }
    }
    
    return false
}
isInclude(target: "1", strings: ["1","2","3"])//调用函数的时候,显示参数名target和strings.

1.3 参数默认值(即给函数的参数赋予默认的值)

func isInclude2(target isInclude:String="a",strings inArray:Array<String>)->Bool{
    
    for item in inArray{
        
        if item == isInclude{
            
            return true
        }
    }
    
    return false
}
isInclude2(target: "2", strings: ["1","2","3"])//参数虽然有默认值,但是仍然重新赋值
isInclude2(strings: ["a","b","c"])//参数不重新赋值,用默认值,即target是默认的字符串"a"

1.4变量参数(参数值是变量,即参数是可以改变的)

func sum(var firstValue:Double,values:Double...)->Double{//参数默认是常量let,除非用var标识,才是变量
    
    for item in values{
        
        firstValue += item//参数在函数内部可以改变
    }
    
    return firstValue
}

sum(2, values: 1,2,3)

1.5输入/输出参数(即在函数内部可以修改外部变量的值,其实质是指针的传递,而不是值传递),一般情况下都是值传递,即函数内部不能改变函数外部的值。但是输入输出参数是指针传递,内部是可以修改外部值的。

func sum2(inout firstValue:Double,values:Double...)->Double{//输入输出参数要inout作为标识。
    
    for item in values{
        
        firstValue += item
    }
    
    return firstValue
}

var firstValue = 5.0

sum2(&firstValue, values: 1,2,3)//传递的是指针

print(firstValue)//外部的参数值已经被改变,此时打印的是11

sum2(&firstValue, values: 1,2,3)//可以看出参数值已经在前一个函数中被改变,此时打印的结果是17

1.5函数本身作为参数

func max(bigger:(Double,Double)->Double,values:Double...)->Double{//max函数有一个函数参数,这个函数参数的格式是(Double,Double)->Double。任何符合这个格式的函数(或者是闭包)都可以作为参数
    
    var maxValue = values[0]
    
    for var i=0;i<values.count;++i{
        
        maxValue = bigger(maxValue,values[i])
    }
    
    return maxValue
    
}
func bigger2(firstValue:Double,secondValue:Double)->Double{//符合上面的参数格式
    
    return firstValue>secondValue ? firstValue : secondValue
}
func bigger(firstValue:Double)->Double{//不符合上面参数的格式
    
    return 0
}
max(bigger2, values: 1,2,3)//返回值是3,验证正确

1.6 函数作为返回值

//降序
func desc(values:Double...)->[Double]{//定义一个降序方法
    
    var results = values
    
    for var i = 0;i < values.count;++i{
        
        for var j = i+1;j < values.count;++j{
            
            if results[j]>results[i]{
                
                let temp = results[j]
                results[j] = results[i]
                results[i] = temp
            }
        }
    }
    
    return results
}

//升序
func asc(values:Double...)->[Double]{//定义一个升序方法
    
    var results = values
    
    for var i = 0;i < results.count;++i{
        
        for var j = i + 1; j < results.count; ++j{
            
            if (results[i]>results[j]){
                
                let temp = results[i]
                results[i] = results[j]
                results[j] = temp
                
            }
        }
    }
    
    return results
    
}

func sort(orderType:Int)->((values:Double...)->[Double]){//定义一个选择哪个函数的方法,返回的函数必须遵从(values:Double...)->[Double]这个形式
    
    return orderType == 0 ? asc : desc// asc和desc函数必须遵从上面参数和返回值的形式
}

//升序
var sortFunc = sort(0)//返回的值是一个升序函数
sortFunc(values: 1,4,2,6,3)//调用这个返回的函数

//降序
sortFunc = sort(1)//返回一个降序函数
sortFunc(values: 1,4,2,6,3)// 调用这个返回的降序函数

1.7嵌套函数(其本质也是闭包)

func sortFunc(orderType:Int,values:Double...)->[Double]{
    
    func asc(values:[Double])->[Double]{//嵌套的第一个函数,升序。必须调用的时候,这个函数才会执行,否则不会执行。参数不能是区间,要是数组。
        
        var results = values
        
        for var i = 0;i < results.count;++i{
            
            for var j = i + 1; j < results.count; ++j{
                
                if (results[i]>results[j]){
                    
                    let temp = results[i]
                    results[i] = results[j]
                    results[j] = temp
                }
            }
        }
        
        return results

    }
    
    func desc(values:[Double])->[Double]{//嵌套的第二个函数,降序
        
        var results = values
        
        for var i = 0;i < values.count;++i{
            
            for var j = i+1;j < values.count;++j{
                
                if results[j]>results[i]{
                    
                    let temp = results[j]
                    results[j] = results[i]
                    results[i] = temp
                }
            }
        }
        
        return results

    }
    
    return orderType == 0 ? asc(values) : desc(values)//values在这里会被自动转换成数组,而不是区间!!!,所以上面2个函数的参数是数组,而不是区间!!
}
sortFunc(0, values: 5,2,4,1,6,4)


https://www.xamrdz.com/mobile/4vv1957405.html

相关文章: