如何避免类型丢失?

问题描述:

enum Media { 
    case image 
    case video 
} 

struct UploadManager { 

    static func upload(mediaType: Media, data: AnyObject, completion: Response -> Void) { 
    switch mediaType { 
    case .image: 
     uploadImage(data as? UIImage, completion: completion) 
    case .video: 
     uploadVideo(data as? NSURL, completion: completion) 
    } 
    } 

    static func uploadImage(image: UIImage, completion: Response -> Void) { 
    let imageData = UIImagePNGRepresentation(image)! as NSData 
    let options = ["resourcetype": "image"] 
    //API call 
    } 

    static func uploadVideo(filePath: NSURL, completion: Response -> Void) { 
    let options = ["resourcetype": "video"] 
    //API call 

    } 
} 

样品呼叫将是:如何避免类型丢失?

UploadManager.upload(.image, data: data, completion: { 

}) 

这里林制作请求与图像配类型和数据UploadManager。我担心图像和数据是互相排斥的,容易出错。说,我通过.image而不是.video,而向下广播它会导致崩溃。任何方式来处理这个问题

你可以在你的枚举中嵌入数据。例如:

enum Media { 
    case Image(image: UIImage) 
    case Video(url: NSURL) 
} 

而且你可以在match-case提取出来:

static func upload(media: Media, completion: Response -> Void) { 
    switch media { 
    case .Image(let image): 
     uploadImage(image, completion: completion) 
    case .Video(let url): 
     uploadVideo(url, completion: completion) 
    } 
} 

然后,您可以调用此方法是这样的:

let image = UIImage() 
UploadManager.upload(.Image(image)) { response in 
    print("Upload complete!") 
}