当前位置: 首页 > 面试题库 >

通过Swift中的函数(或Init)传播可选内容

颛孙庆
2023-03-14
问题内容

有没有人(更好)的方法来做到这一点?

可以说我有一个可选的Float

let f: Float? = 2

现在我想将其转换为Double

let d = Double(f) //fail

这显然会失败,但是有没有办法像通过计算变量那样通过函数链接可选项?我现在正在做的是这样的:

extension Float {
    var double: Double { return Double(self) }
}
let d: Double? = f?.double

但是我真的不喜欢将强制转换作为计算变量。

我考虑使用的另一个选项是:

public func optionalize<A,B>(_ λ : @escaping (A) -> B) -> (A?) -> B? {
    return { (a) in
        guard let a = a else { return nil }
        return λ(a)
    }
}
let d: Double? = optionalize(Double.init)(f)

我意识到我可以保护’f’的值来解开它。但是,在许多情况下,可选值将是返回可选函数的参数。这导致防护中的中间值。如本例所示:

func foo(_ a: String?) throws -> Float {
    guard 
        let a = a,
        let intermediate = Float(a)
    else { throw.something }
    return intermediate
}

在这里,从String到Float的转换也可能会失败。至少使用计算出的变量,这个foo函数会更干净一点

extension String {
    var float: Float? { return Float(self) }
}

func foo(_ a: String?) throws -> Float {
    guard 
        let a = a?.float
    else { throw.something }
    return a
}

我不想重写频繁初始化的可选版本。

任何想法将不胜感激。谢谢!


问题答案:

您可以简单地使用Optionalmap(_:)方法,该方法将返回包装的值,如果该值不为nil,则应用给定的转换,否则将返回nil

let f : Float? = 2

// If f is non-nil, return the result from the wrapped value passed to Double(_:),
// else return nil.
let d = f.map { Double($0) }

正如您在下面的评论中指出的那样,也可以这样表示:

let d = f.map(Double.init)

这是因为在这种情况下html" target="_blank">map(_:)期望类型的转换函数(Float) -> Double,而Doublefloat初始化程序
就是 这样的函数。

如果变换也返回一个可选的(例如转换一个当为String一个Int),就可以使用flatMap(_:),其只是传播的nil变换结果返回给调用者:

let s : String? = "3"

// If s is non-nil, return the result from the wrapped value being passed to the Int(_:)
// initialiser. If s is nil, or Int($0) returns nil, return nil.
let i = s.flatMap { Int($0) }


 类似资料:
  • 问题内容: 如您所知,可以如下初始化对象: 是否可以通过函数定义类似这样的对象: 我的目标实际上是从API中获取对象,并通过ng-repeat将它们显示在列表中 问题答案: 该文件说将采用任何表达方式。因此,是的,只要关联的作用域定义了一个称为的函数,您就可以做上面的事情(我也为乐趣进行了验证)。 请注意,该文档说,这实际上仅旨在用于别名: ngInit用于别名化ngRepeat的特殊属性的唯一适

  • 问题内容: 是否可以为可选的通用参数提供默认值? 我正在尝试做这样的事情: 但我说错了 这只是我试图做的不可能的事吗? 问题答案: 用您完成的方式是不可能的。仅考虑上述代码,什么是类型?就像它说的那样,编译器无法弄清楚(我也不能,因为数据不存在,我也不能。) 特定问题的解决方案是重载而不是使用默认值: 但这引发了您在这里做什么的问题。您会认为应该如此。否则,您在做什么?如果不诉诸(您应该强烈避免)

  • 我希望我可以检查并将可选的内容转换为另一个类或拥有一个空对象,而不是编写自己的方法或类。 对于应用程序中的这个子问题,我希望将树节点实例的自定义用户对象转换为自定义用户对象,前提是树节点是默认可变树节点的实例。 我记得我需要经常以这种方式播放可选或流。它不流利。实际上,我希望java Optional或Stream有一个执行上述步骤的cast方法。我不想编写自己的fluent CustomOpti

  • 当我将firstThing(第一件事)设置为default(默认值)时,如果没有默认值nil(默认值),这将起作用,我会得到一个错误,即调用函数时缺少参数。 通过键入Int 我认为它使它成为可选的,默认值为零,对吗?如果是这样,为什么没有=nil它就不能工作?

  • 问题内容: 有什么方法可以通过引用SASS中的另一个函数或mixin来传递函数或mixin,然后调用引用的函数或mixin? 例如: 问题答案: 在Sass中,函数和混合函数不是 一流 的,这意味着您不能像传递变量那样将它们作为参数传递。 最接近的指令是(Sass 3.2+)。 唯一需要注意的是,您无法看到mixin内部的内容。换句话说,如果仅在mixin 内部定义,则它实际上将不存在,因为不在范

  • 问题内容: 您能否指出我跳过JavaScript中可选参数的好方法。 例如,我想在这里丢弃所有参数: 问题答案: 解: 您应该使用而不是要跳过的可选参数,因为这100%会模拟JavaScript中可选参数的默认值。 小例子: 强烈建议 :如果您有很多参数,请使用JSON,并且可以在参数列表的中间包含可选参数。看看这是如何在jQuery中完成的。