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

时间:2017-09-07 03:03:28

标签: swift macos frameworks access-control type-alias

我已经看到这个技巧来实现一个与平台无关的接口(比如说)图像类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;。

1 个答案:

答案 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。