【问题标题】:Passing 0 as an enum option into Objective C functions in Swift将 0 作为枚举选项传递给 Swift 中的 Objective C 函数
【发布时间】:2015-03-15 06:45:49
【问题描述】:

有一些带有将整数枚举选项作为参数的函数的 Objective-C 库,但是如果你想要默认选项,他们希望你传递 0,这是典型的。但在 Swift 中,这是不允许的,因为库指定了枚举类型。有没有什么办法可以解决这个问题,除了向库中添加一个 0 枚举选项然后制作桥接代码以使其 ObjC 枚举在 Swift 中工作?

这是一个在 iPhone 应用中使用 SDWebImageManager 的示例:

SDWebImageManager.sharedManager().downloadWithURL(url, options: 0, progress: nil) { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool) -> Void in
            // block code here
        }

Xcode 会指出一个错误,它显示为options: 0,因为'Int' is not convertible to SDWebImageOptions。我尝试了类似以下的方法,但我得到了同样的错误:

let emptyOptions:SDWebImageOptions = 0

【问题讨论】:

    标签: objective-c swift enums


    【解决方案1】:

    从 Swift 2 开始,选项集的语法已更改为使用数组字面量。所以如果你不想传递任何选项,你传递一个空列表:

    SDWebImageManager.sharedManager().downloadWithURL(url, options: [], progress: nil) { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool) -> Void in
        // code here
    }
    

    【讨论】:

    • 我在尝试时收到错误 SDWebImageOptions does not conform to protocol NilLiteralConvertible。听起来 Swift 希望 downloadWithURL 函数接受 options 的可选参数,如果我这样做的话,但当然 ObjC 不支持可选类型。
    • 确保您使用的是最新版本的 Xcode。这段代码应该可以工作。在 Objective-C 中用 NS_OPTIONS 声明的枚举成为在 Swift 中实现 RawOptionSetType 的结构。 RawOptionSetType 继承到 NilLiteralConvertible。作为替代方案,您可以使用SDWebImageOptions.allZerosSDWebImageOptions(0)
    • SDWebImageOptions(rawValue:0) 怎么样?
    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 2011-12-04
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多