gpt4 book ai didi

swift - 包装的 SwiftUI View 的类似子类的行为

转载 作者:行者123 更新时间:2023-12-04 10:46:10 25 4
gpt4 key购买 nike

我将尝试用一个例子来解释我在寻找什么。

假设我已经实现了一个加载图像的概念,它看起来像这样:

struct AsyncImage: View {
@ObservedObject private var imageDownloader: ImageDownloader

init(url: URL) {
imageDownloader = ImageDownloader(url: url)
}

var body: Image {
Image(uiImage: imageDownloader.image)
}
}

class ImageDownloader: ObservableObject {
@Published var image: UIImage

init(url: URL) { /* ... */ }
// implementation details unimportant
}

上述实现允许通过应用程序轻松重用:

struct UserDetailsView: View {
var body: some View {
VStack {
AsyncImage(url: userProfileUrl).resizable().aspectRatio(16.0 / 9.0, contentMode: .fit)
Text(user.name)
}
}
}

但是上面的代码不能编译,如 resizable()只是 Image 的一部分.如何以干净的方式提供此功能?

添加 isResizable结构体的标志将解决问题,但是该解决方案既不可扩展也不向前兼容。

使用 Publisher和一个 ViewModifier可能会起作用,但是我无法理解这些概念的组合。

任何解决这个问题的建议?还是我试图以错误的方式解决这个问题?

最佳答案

方法可能如下 - 将所需的修饰符代理到内部包装 Image .不理想,但在某些情况下值得考虑

struct AsyncImage: View {
@ObservedObject private var imageDownloader: ImageDownloader

private let resizing: Bool

init(url: URL, resizalbe: Bool = false) {
imageDownloader = ImageDownloader(url: url)
resizing = resizalbe
}

var body: some View {
var image = Image(uiImage: imageDownloader.image)
if resizing {
image = image.resizable()
}
return image
}

func resizable() -> Self {
AsyncImage(url: imageDownloader.url, resizalbe: true)
}
}

结果 UserDetailsView变得可编译。

关于swift - 包装的 SwiftUI View 的类似子类的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com