我想创建一个通用函数来将存储的数据转换为不同的数据类型,如:
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
}
}
现在我得到“从'T.Type'转换为无关类型'UIImage'/'AVAudioPlayer'总是失败”。这有什么不对?谢谢。
我会在这里使用协议,而不是将自己锁定为一个固定的,不可扩展的受支持类型(在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
}
}
}