这个问题涉及在Swift 2.2中作为协议扩展编写的函数的效率.有谁知道加快这个运行时间的方法?
假设我有一个符合Int的协议号
protocol Number: Equatable, IntegerLiteralConvertible {
init(_ int: Int)
init(_ number: Self)
func +(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
}
extension Int: Number { }
Run Code Online (Sandbox Code Playgroud)
现在我想写一个阶乘函数作为Number的扩展
extension Number {
func factorialNumber() -> Self {
if self == 0 { return 1 }
return self * (self - 1).factorialNumber()
}
}
Run Code Online (Sandbox Code Playgroud)
我也写了与Int的扩展相同的功能
extension Int {
func factorialInt() -> …Run Code Online (Sandbox Code Playgroud) 有没有人(更好)的方式来做到这一点?
可以说我有一个可选的Float
let f: Float? = 2
Run Code Online (Sandbox Code Playgroud)
现在我想将它转换为Double
let d = Double(f) //fail
Run Code Online (Sandbox Code Playgroud)
这显然会失败,但有没有办法通过函数链接可选的计算变量?我现在在做的是:
extension Float {
var double: Double { return Double(self) }
}
let d: Double? = f?.double
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢将演员表作为计算变量.
我考虑使用的另一个选项是:
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)
Run Code Online (Sandbox Code Playgroud)
我意识到我可以保护'f'的价值来解开它.但是,在许多情况下,可选值将是返回可选项的函数的参数.这导致防护中的中间值.如下例所示:
func foo(_ a: String?) throws -> Float {
guard
let …Run Code Online (Sandbox Code Playgroud)