Swift通用数据转换函数

时间:2017-12-22 22:51:47

标签: swift generics

我想创建一个通用函数,将存储的数据转换为不同的数据类型,如:

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;。这里有什么问题?谢谢。

1 个答案:

答案 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
        }
    }
}