资讯专栏INFORMATION COLUMN

Swift: 可变参数

archieyang / 2086人阅读

摘要:官网文档链接使用可变参数,其实很简单。如果要使用可变参数。小二,继续上代码会从的指针地址开始取值,直至记得清空使用这个宏,会从的指针地址开始,一个一个的去取值。

转自: https://addicechan.github.io/...

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

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

小二。。上代码~~~

// 多数字相加
func add(_ values: Int...) -> Int {
    return values.reduce(0){ $0 + $1 }
}

print(add(1,5,8,9))
// 23

再比如,可以封装一个UIAlertController。如果觉得每次得写一大堆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的话,那么也是会导致 不停的取值,于是,拿到未初始化的内存空间后,就导致崩溃啦。Boom....

写完这个方法后,只能感叹下Swift封装的太好了。很方便的...语法,加上高阶函数的使用。貌似也不太算很公正的对比。(逃。

func add(_ values: String...) -> String {
    return values.reduce(""){ $0 + $1 }
}

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

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

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

哭瞎了。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16721.html

相关文章

  • Swift可变参数

    摘要:官网文档链接使用可变参数,其实很简单。如果要使用可变参数。小二,继续上代码会从的指针地址开始取值,直至记得清空使用这个宏,会从的指针地址开始,一个一个的去取值。 在Swift中,命名一个方法参数的时候,如果有多个特定类型的参数,可以直接使用可变参数(Variadic Parameters)。官网文档链接 使用可变参数,其实很简单。就是在参数类型加上…。比如Int…。实际上,方法内部去调...

    shiweifu 评论0 收藏0
  • Swift锋芒毕露 无脑意译

    摘要:建议尽量避免无用选项关键字。在选项关键字也是这样的原理,也只有两种情况有值跟中选项与布尔同样都用枚举定义。如果你要存一个布尔或者字符串的字典,你可以使用作为值。如果我们擅自添加了一类情况,我们需要更新所有用到该类枚举类型得代码。 前言 作者自己说自己很喜欢swift,因为他喜欢Haskell。可能看上了swift支持函数式编程的缘故。 中间扯皮各种略。。。 扯到函数编程刚开始不习...

    APICloud 评论0 收藏0
  • swift3学习笔记

    摘要:只将需要改变的值声明为变量。使用或者方法来判断一个合是否是另外一个合的子合或者父合并且两个合并不相等。 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Object-C的一些相关特性这里也不做介绍,只记录swift特有的一些特性swift借鉴了很多语言的语法,特别是脚本语言,在swift里,可以看到python语言的一些影子,还...

    txgcwm 评论0 收藏0
  • Swift中使用C语言的指针

    摘要:为安全起见,要求在使用传值时,变量必须是已经被初始化的。你可以安全的使用全局或静态变量的指针的参数,比如上下文参数。本文首发地址在中使用语言的指针 Objective-C和C语言经常需要使用到指针。Swift中的数据类型由于良好的设计,使其可以和基于指针的C语言API无缝混用。同时Swift也可以自动处理大多数将指针作为参数的情况。在这篇文章里,我们可以看到在Swift语言中如何将变量...

    DesGemini 评论0 收藏0
  • 善变的Swift函数

    摘要:略一句不思议的返回类型的返回值显然比复杂多了,特别是可选类型与多值类型。多值返回混杂可选当多值返回中返回值中夹杂这可选类型是需要技巧的,这里介绍两种处理方式。 原文链接:http://www.objc.io/issue-16/swift-functions.html 前言 尽管OC跟其他语言有些很奇形怪状的语法,但是一旦你找到窍门方法语法还是相当直截了当的。快速回顾下: + (v...

    魏明 评论0 收藏0

发表评论

0条评论

archieyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<