我有一个函数,如果满足条件,则返回图像,否则返回nil
- (UIImage *)getProfilePic{
if (doc.userProperties != nil) {
UIImage *image = [UIImage imageNamed:@"placeholder.png"];
return image;
}
else {
return nil;
}
}
我想转换这是在快速。我已经尝试过这个,但它在返回 nil 时显示错误,并且通过将错误显示为解包 nil 而崩溃。
func getProfilePic(){
var image : UIImage?
if doc!.userProperties != nil {
image = UIImage(named: "placeholder.png")!
return image!
}
else {
return nil
}
}
在"返回 nil"行,它显示 nil 与返回类型"uiimage"不兼容
func getProfilePic(){ var image : UIImage? if doc!.userProperties != nil { image = UIImage(named: "placeholder.png")! return image! } else { return nil } }
对,所以这里有一些问题。 首先,代码没有返回类型。 如果我们忽略你的方法的主体,只看签名,Objective-C等价物将如下所示:
- (void)getProfilePic;
所以 Swift 和 Objective-C 在这里会抱怨同样的事情:你试图返回的内容和方法的声明返回类型不匹配。
如果你对 Objective-C 比 Swift 更熟悉,所以如果你对 Swift 方法比 Swift 更熟悉,下面是如果我们将其转换回 Objective-C 会是什么样子的 Swift 方法:
- (void)getProfilePic {
UIImage *image;
if (doc.userProperties) {
image = UIImage(named: @"placeholder.png");
return image;
}
else {
return nil;
}
}
同样,这将生成相同或相似的编译时警告或错误,因为返回类型与方法签名不匹配。 但是 Objective-C 不会因为解开nil
而崩溃(但 Swift 会)。
您实际尝试返回的是一个UIImage?
,因此我们需要更新我们的方法签名。
func getProfilePic() -> UIImage? {
if doc?.userProperties != nil {
return UIImage(named: "placeholder.png")
}
return nil
}
假设userProperties
可能包含您想要下载的图像的 URL 或图像本身,将来我们将需要一个稍微不同的结构......更像这样的东西:
func getProfilePic() -> UIImage? {
guard let userProperties = doc?.userProperties else {
return nil
}
// extract the image from userProperties and return it
}
试试这个代码示例:
func getProfilePic() -> UIImage? {
let imageName = "placeholder.png"
var image: UIImage?
if (doc.userProperties != nil) {
image = UIImage(named: imageName)
}
return image
}