为什么 if != nil 仅在应用程序使用期间才起作用?
Why the if != nil works only sometimes during the app being used?
我遇到了一个问题,需要你的帮助。我正在开发一个应用程序来管理事件,当应用程序加载时,所有 post 都会按预期显示,无论是否有图像进入 post。如果我添加一个包含图像的新 post,它会正确保存并返回到显示新 post 的滚动视图,如果我编辑任何有图像的项目并在保存或添加时保留图像将图像放入编辑前没有图像的 post 可以很好地保存并且 post 会立即显示到滚动视图中。
问题是,如果我尝试创建一个没有图像的新 post,或者如果我编辑 post 删除图像并保存,应用程序会因展开选项而崩溃,但奇怪的是我正在检查 nil值到显示图像的滚动视图的点。
ScrollView {
VStack(spacing: 15){
ForEach(items, id: \.self) { item in
VStack(spacing: 15) {
if item.pic != nil {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .top)) {
Image(uiImage: UIImage(data: item.pic!)!)
.resizable()
.aspectRatio(contentMode: .fill)
.cornerRadius(15)
}
.padding()
.opacity(1)
}
有什么想法吗?非常感谢您的支持。
你在这里有两个强制展开。您对 != nil
的测试仅保护第一个;尝试访问 item.pic
数据。但是,如果将该数据转换为 UIImage
失败怎么办? - 可失败的初始化程序将 return nil
,然后你强制解包 - 这将导致崩溃。
一种更安全的方法是避免所有强制解包。我会在你的模型中添加一个计算的 属性:
extension Item {
var image: Image? {
guard let data = self.pic, let uiImage = UIImage(data: data) else {
return nil
}
return Image(uiImage: uiImage)
}
}
那你就可以说:
ScrollView {
VStack(spacing: 15){
ForEach(items, id: \.self) { item in
VStack(spacing: 15) {
if let image = item.image {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .top)) {
image
.resizable()
.aspectRatio(contentMode: .fill)
.cornerRadius(15)
}
.padding()
.opacity(1)
}
}
}
}
}
您还可以将整个 ZStack
封装在 View
子类中以进一步简化事情
而不是 return 一个可选的 Image
你可以 return 一个占位符图像;由你决定。
我遇到了一个问题,需要你的帮助。我正在开发一个应用程序来管理事件,当应用程序加载时,所有 post 都会按预期显示,无论是否有图像进入 post。如果我添加一个包含图像的新 post,它会正确保存并返回到显示新 post 的滚动视图,如果我编辑任何有图像的项目并在保存或添加时保留图像将图像放入编辑前没有图像的 post 可以很好地保存并且 post 会立即显示到滚动视图中。 问题是,如果我尝试创建一个没有图像的新 post,或者如果我编辑 post 删除图像并保存,应用程序会因展开选项而崩溃,但奇怪的是我正在检查 nil值到显示图像的滚动视图的点。
ScrollView {
VStack(spacing: 15){
ForEach(items, id: \.self) { item in
VStack(spacing: 15) {
if item.pic != nil {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .top)) {
Image(uiImage: UIImage(data: item.pic!)!)
.resizable()
.aspectRatio(contentMode: .fill)
.cornerRadius(15)
}
.padding()
.opacity(1)
}
有什么想法吗?非常感谢您的支持。
你在这里有两个强制展开。您对 != nil
的测试仅保护第一个;尝试访问 item.pic
数据。但是,如果将该数据转换为 UIImage
失败怎么办? - 可失败的初始化程序将 return nil
,然后你强制解包 - 这将导致崩溃。
一种更安全的方法是避免所有强制解包。我会在你的模型中添加一个计算的 属性:
extension Item {
var image: Image? {
guard let data = self.pic, let uiImage = UIImage(data: data) else {
return nil
}
return Image(uiImage: uiImage)
}
}
那你就可以说:
ScrollView {
VStack(spacing: 15){
ForEach(items, id: \.self) { item in
VStack(spacing: 15) {
if let image = item.image {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .top)) {
image
.resizable()
.aspectRatio(contentMode: .fill)
.cornerRadius(15)
}
.padding()
.opacity(1)
}
}
}
}
}
您还可以将整个 ZStack
封装在 View
子类中以进一步简化事情
而不是 return 一个可选的 Image
你可以 return 一个占位符图像;由你决定。