在Swift中,函数返回两种以上的类型是否是最佳方式?

在Swift中,函数返回两种以上的类型是否是最佳方式?,swift,optimization,enums,tuples,Swift,Optimization,Enums,Tuples,我需要有一个函数,该函数应该返回安全的随机字符串或数据,将来可能扩展为其他类型 我开始寻找建议,发现这可以通过枚举和元组实现 我决定继续执行枚举 我的实施: enum SecureRandomInput { case forString case forData } enum SecureRandomOutput { case forString(String) case forData(Data) static func generate(with

我需要有一个函数,该函数应该返回安全的随机字符串数据,将来可能扩展为其他类型

我开始寻找建议,发现这可以通过枚举元组实现

我决定继续执行枚举

我的实施:

enum SecureRandomInput {
    case forString
    case forData
}


enum SecureRandomOutput {
    case forString(String)
    case forData(Data)

    static func generate(with type: SecureRandomInput, bytesCount: Int) -> SecureRandomOutput {
        var randomBytes = [UInt8](repeating: 0, count: bytesCount)
        let _ = SecRandomCopyBytes(kSecRandomDefault, bytesCount, &randomBytes)
        switch type {
        case .forString:
            return SecureRandomOutput.forString(randomBytes.map({ String(format: "%02hhx", $0) }).joined(separator: ""))
        case .forData:
            return SecureRandomOutput.forData(Data(bytes: randomBytes, count: bytesCount))
        }
    }
}
因此,问题是:

1) 枚举在特定情况下的使用比元组更灵活

2) 你对这部分代码有什么建议吗?(还有什么可以做得更好)

3) 在Swift 4中,我们还有其他方法可以实现所需的行为吗?(不带枚举和元组)

  • 我同意你的观点,枚举是分离不同行为而不是创建大量元组的更清晰的方法

  • 代码相当标准

  • 在我看来,如果两个结果都有任何类型的大量共享数据,这种情况也可以由常规类或结构来处理(初始化/生成一些东西,比如
    SecRandomCopyBytes(kSecRandomDefault、bytescont和randomBytes)
    等等)。目前来说,这很好,但在将来,它可能是重构代码的一种选择


  • 另一种方法是使用闭包和泛型

    func generate<T>(bytesCount: Int, convert: ([UInt8]) ->T ) -> T {
        var randomBytes = [UInt8](repeating: 0, count: bytesCount)
        let _ = SecRandomCopyBytes(kSecRandomDefault, bytesCount, &randomBytes)
        return convert(randomBytes)
    }
    
    let x = generate(bytesCount: 7) {
        return Data(bytes: $0, count: $0.count)
    }
    
    let y = generate(bytesCount: 7) { bytes in
        return bytes.map({ String.init(format: "%02hhx", $0) }).joined(separator: "")
    }
    
    func生成(字节数:Int,转换:([UInt8])->T)->T{
    var randomBytes=[UInt8](重复:0,计数:字节计数)
    let u=SecRandomCopyBytes(kSecRandomDefault、bytesCount和randomBytes)
    返回转换(随机字节)
    }
    设x=generate(字节数:7){
    返回数据(字节:$0,计数:$0.count)
    }
    设y=generate(字节数:7){bytes in
    返回bytes.map({String.init(格式:'%02hhx',$0)})。已加入(分隔符:“”)
    }
    
    Thx对于答案来说,泛型是一种非常好的方式。如果这是您从实际项目中获得的代码(不是存根、伪代码或示例代码),并且按照预期工作,并且您正在寻找评论和可能的改进,那么这是一个更好的地方。参见SO与CR的对比。