Swift通用数据转换功能

问题描述 投票:0回答:1

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

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'总是失败”。这有什么不对?谢谢。

swift generics
1个回答
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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.