Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift通用数据转换函数_Swift_Generics - Fatal编程技术网

Swift通用数据转换函数

Swift通用数据转换函数,swift,generics,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 A

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

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
    }
}
导入UIKit
进口AVKit
func表示(u-data:data)->T?{
开关T.self{
案例为UIImage:
guard let image=UIImage(数据:data)else{return nil}
返回图像
案例为AVAudioPlayer:
guard let audio=try?AVAudioPlayer(数据:data)else{return nil}
返回音频
违约:
归零
}
}

现在我得到“从'T.Type'转换到不相关的'UIImage'/'AVAudioPlayer'总是失败”。这里怎么了?谢谢。

我会在这里使用协议,而不是将自己锁定在固定的、不可扩展的支持类型中(您在switch语句中硬编码的类型):

导入UIKit
进口AVKit
协议数据初始化{
init?(数据:数据)抛出
}
扩展UIImage:DataInitializable{}
扩展AVAudioPlayer:DataInitializable{}
扩展数据{
func decode()->T{
做{
返回try T(数据:self)
}
抓住{
归零
}
}
}

我会在这里使用协议,而不是将自己锁定在固定的、不可扩展的支持类型(您在switch语句中硬编码的类型)中:

导入UIKit
进口AVKit
协议数据初始化{
init?(数据:数据)抛出
}
扩展UIImage:DataInitializable{}
扩展AVAudioPlayer:DataInitializable{}
扩展数据{
func decode()->T{
做{
返回try T(数据:self)
}
抓住{
归零
}
}
}

没有必要像您这样展开
图像
/
音频
变量。当它们为nil时,你返回nil,当它们不为nil时,你返回它们。在这种情况下,你可以直接返回它们的值。这个函数不是一个展开器-我要构造一个协议,我只需要一个通用函数。没有必要像你这样展开
图像
/
音频
变量。当它们为nil时,你返回nil,当它们不为nil时,你返回它们。在这种情况下,你可以直接返回它们的值。这个函数不是一个解包器-我要构造一个协议,我只需要一个泛型函数。你试过编译你的代码吗?图像数据来自哪里?唯一的参数是数据。这同样适用于音频数据。顺便说一句,从
Data
UIImage
的强制转换将始终失败。如果可以成功,为什么要初始化一个新对象?你只要把它还给我。@LeoDabus不,哈哈,我现在正在看,我意识到这太离谱了:
returntry?T(data:self)
@Yannick,使结果表达式具有类型
T??
。您可以这样做:
return(try?T(data:self)).flatMap{$0}
,但对于那些不熟悉可选的flatmap@Alexander你是对的,我的错。是的,我也更喜欢你答案中的答案,而不是评论中的答案!你试过编译你的代码吗?图像数据来自哪里?唯一的参数是数据。这同样适用于音频数据。顺便说一句,从
Data
UIImage
的强制转换将始终失败。如果可以成功,为什么要初始化一个新对象?你只要把它还给我。@LeoDabus不,哈哈,我现在正在看,我意识到这太离谱了:
returntry?T(data:self)
@Yannick,使结果表达式具有类型
T??
。您可以这样做:
return(try?T(data:self)).flatMap{$0}
,但对于那些不熟悉可选的flatmap@Alexander你是对的,我的错。是的,我也更喜欢你答案中的答案,而不是评论中的答案!
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
        }
    }
}