小编Mr *_*ynn的帖子

Swift协议性能

这个问题涉及在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)

performance protocols swift swift2

18
推荐指数
1
解决办法
594
查看次数

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

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

可以说我有一个可选的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)

optional swift

5
推荐指数
1
解决办法
163
查看次数

标签 统计

swift ×2

optional ×1

performance ×1

protocols ×1

swift2 ×1