栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以将Int.init传递给Swift中的函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以将Int.init传递给Swift中的函数?

问题在于不存在 具有参数的

Int
初始化程序。 __
String

目前只存在:

init?(_ text: String, radix: Int = default)

尽管该

radix:
参数具有默认值,但是编译器仅在初始化程序的调用位置为您“填充”该默认值。

获取对函数本身的引用时,不会部分应用默认参数值,编译器也不会为默认参数值的所有可能组合生成额外的重载。后者不仅会给您的代码增加很大的膨胀,而且这两个选项都会破坏默认参数值,该默认参数值取决于在调用站点处插入的值(例如

#file
#line
)。

为了使其正常工作,函数值本身必须支持默认参数值,这带来了相当大的复杂性。尽管这可能是该语言的未来版本所支持的东西。

一种获得所需行为的简单解决方案是只编写一个扩展,在

Int
其上添加一个
init(_:)
初始化程序,然后将其转发到
init(_:radix:)

extension Int {    /// Creates a new integer value from the given base-10 integer string, returning nil    /// if the string is in an invalid format.    init?(_ string: String) {        // we're saying (_:radix:) in order to disambiguate the call, the compiler        // will insert the default parameter value of radix: for us.        self.init(_:radix:)(string)    }}

请注意,在Swift
4中,这可能是的扩展

FixedWidthInteger
,它提供
init(_:radix:)
了标准库的整数类型的实现。

现在您可以说:

let x = ["10", "20", "30"]let y = x.map(Int.init) // [Optional(10), Optional(20), Optional(30)]

因为

Int.init
现在是指我们的扩展初始化器。

这也适用于

flatMap(_:)

let y = x.flatMap(Int.init) // [10, 20, 30]

这也会

nil
从转换中过滤掉元素(不可转换为整数的字符串)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号