Swift:可变参数

Swift:可变参数,第1张

概述在Swift中,命名一个方法参数的时候,如果有多个特定类型的参数,可以直接使用可变参数(Variadic Parameters)。官网文档链接 使用可变参数,其实很简单。就是在参数类型加上…。比如Int…。实际上,方法内部去调用该参数的话,Xcode提示的是[Int]。也就是一个Array。这样也是大大方便。不用非得去声明一个[Int]。 小二。。上代码~~~ // 多数字相加func add(

Swift中,命名一个方法参数的时候,如果有多个特定类型的参数,可以直接使用可变参数(Variadic Parameters)。官网文档链接

使用可变参数,其实很简单。就是在参数类型加上。比如Int…。实际上,方法内部去调用该参数的话,Xcode提示的是[Int]。也就是一个Array。这样也是大大方便。不用非得去声明一个[Int]

小二。。上代码~~~

// 多数字相加func add(_ values: Int...) -> Int {    return values.reduce(0){ UIAlertController +  }}print(add(1,5,8,9))// 23

再比如,可以封装一个alert.addAction()。如果觉得每次得写一大堆

extension UIAlertController {    class func show(_ vc: UIVIEwController?,Title: String,msg: String,style: UIAlertControllerStyle,btns: String...,completionHandler:@escaPing ((_ btnIndex: Int) -> VoID)) {        let alertController : UIAlertController = UIAlertController(Title: Title,message: msg,preferredStyle: style)                for (index,element) in btns.enumerated() {            alertController.addAction(UIAlertAction(Title: element,style: .default,handler: { _ in                completionHandler(index)            }))        }                if style == .actionSheet {            alertController.addAction(UIAlertAction(Title: "cancel",style: .cancel,handler: nil))        }                vc?.present(alertController,animated: true,completion: nil)    }}// 使用UIAlertController.show(self,Title: "Alert",msg: "show alert",style: .alert,btns: "prevIoUs","next") { index in         print(index)}
巴拉巴拉.

Objective-C

不过,可变参数无法用于Objective-C中。

va_List如果要使用可变参数。那么需要使用到C函数等系列

- (Nsstring *)add:(Nsstring *)value,... NS_REQUIRES_NIL_TERMINATION {    NSMutableString *result = [NSMutableString string];    [result appendString:value];    if (value) {        va_List values;        // values 会从 value 的指针地址开始取值,直至nil        va_start(values,value);        ID tempValue;        while((tempValue = va_arg(values,Nsstring *))) {            [result appendString:tempValue];        }                // 记得清空        va_end(values);    }    return result;}

小二,继续上代码~~~

va_start

使用value这个宏,会从非指针的指针地址开始,一个一个的去取值。对于NS_REQUIRES_NIL_TERMINATION的话,那么就无法实现。至于 方法名后面的nil,则是在方法调用的时候,加上nil作为终结。因为如果没有Swift的话,那么也是会导致 不停的取值,于是,拿到未初始化的内存空间后,就导致崩溃啦。Boom....

写完这个方法后,只能感叹下...封装的太好了。很方便的高阶函数语法,加上

func add(_ values: String...) -> String {    return values.reduce(""){ Objective-C +  }}
的使用。貌似也不太算很公正的对比。(逃。

Swift

这样几行代码,就已经实现了上述Objective-C写的方法了。

写这篇的根源,其实是在翻(gen)看(ben)NSArray(jiu)的(bu)官(zhi)方(dao)文(de)档(shuo)。于是看到可变参数这玩意了。后来想想,UIAlertVIEw的、等,其实也是基于这样去写的。

算是又明白了一些。但愿不太迟。

哭瞎了。。。

总结

以上是内存溢出为你收集整理的Swift:可变参数全部内容,希望文章能够帮你解决Swift:可变参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1064683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存