我已经看到这个技巧来实现一个与平台无关的接口(比如说)图像类UIImage / NSImage:
#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
}
}
我收到错误:
属性无法声明为开放,因为其类型使用内部类型
&#34;内部类型&#34;参考NSImage? 如何解决这个问题?
注意:我不认为这是this question的副本:我使用的是 typealias ,但不明显是什么声明我应该标记为&#34; public&#34;。
答案 0 :(得分:1)
在这种特定情况下(在框架目标中使用时),使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
}
}
这同样适用于使用此类型的任何公共方法,无论它是参数还是函数的返回类型。
Offtopic:确保在后台队列/线程上初始化此类,以避免在下载映像时阻塞主线程并冻结UI。