在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的对比。