我想创建一个通用函数,将存储的数据转换为不同的数据类型,如:
import UIKit
import AVKit
func represent<T>(_ data: Data) -> T? {
switch T.self {
case is UIImage:
guard let image = UIImage(data: data) else { return nil }
return image
case is AVAudioPlayer:
guard let audio = try? AVAudioPlayer(data: data) else { return nil }
return audio
default:
return nil
}
}
现在我得到了&#34;来自&#39; T.Type&#39;不相关的类型&#39; UIImage&#39; AVAudioPlayer&#39;总是失败&#34;。这里有什么问题?谢谢。
答案 0 :(得分:3)
我会在这里使用协议,而不是将自己锁定为一个固定的,不可扩展的受支持类型(在switch语句中硬编码的那些):
import UIKit
import AVKit
protocol DataInitializable {
init?(data: Data) throws
}
extension UIImage: DataInitializable {}
extension AVAudioPlayer: DataInitializable {}
extension Data {
func decode<T: DataInitializable>() -> T? {
do {
return try T(data: self)
}
catch {
return nil
}
}
}