gpt4 book ai didi

swift - 无法将属性声明为开放,因为其类型使用内部类型 (Typealias)

转载 作者:行者123 更新时间:2023-11-28 15:20:30 25 4
gpt4 key购买 nike

我已经看到这个技巧来实现(比方说)图像类 UIImage/NSImage 的平台无关接口(interface):

#if os(iOS)
import UIKit
typealias Image = UIImage

#elseif os(macOS)
import Cocoa
typealias Image = NSImage

#endif

现在我正尝试将它应用到一个框架中。假设我有这样一个类:

public final class MyClass {

public var image: Image // < Compiler Error (see below)

init?(imageURL: URL) {
guard let image = Image(contentsOf: imageFileURL) else {
return nil
}
self.image = image
}
}

我得到错误:

Property cannot be declared open because its type uses an internal type

“内部类型”是指 NSImage 吗? 我该如何解决这个问题?


注意:我认为这不是 this question 的副本: 我正在使用 typealias什么 声明我应该标记为“public”并不明显。

最佳答案

在这种特定情况下(在框架目标中使用时),将 typealias 公开并不能解决问题。在声明图片属性的时候也需要使用平台条件检查,如下:

#if os(iOS)
import UIKit
typealias Image = UIImage
#elseif os(macOS)
import Cocoa
typealias Image = NSImage
#endif

public final class MyClass {

#if os(iOS)
public var image: UIImage
#elseif os(macOS)
public var image: NSImage
#endif

init?(imageURL: URL) {
guard let image = Image(contentsOf: imageFileURL) else {
return nil
}
self.image = image
}
}

这同样适用于任何使用此类型的公共(public)方法,无论它是函数的参数还是返回类型。

Offtopic:确保在后台队列/线程上初始化此类,以避免在下载图像时阻塞主线程和卡住 UI。

关于swift - 无法将属性声明为开放,因为其类型使用内部类型 (Typealias),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087176/

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