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