目标 C 和 Swift 互操作性导致错误“扩展可能不包含存储的属性”

Posted

技术标签:

【中文标题】目标 C 和 Swift 互操作性导致错误“扩展可能不包含存储的属性”【英文标题】:Objective C & Swift Interoperability causes error "Extensions may not contain stored properties" 【发布时间】:2015-06-30 11:07:38 【问题描述】:

我正在开发我以前在 Objective C 上完成的应用程序之一。我需要向它添加一个新模块,我决定为该特定模块使用 Swift。

我在 Objective C 中有一个名为 HomePage 的类,我想在其中添加一些新的 IBActions 和 IBOutlets。为此,我添加了一个新的 swift 文件并扩展了现有的类,例如:

// MARK: IBOutlets and IBActions
extension HomePage

    @IBOutlet var image : UIImageView!
    ...

    /*!
    * Loads the application support webpage
    */
    @IBAction func loadSupportURL(sender : UIButton)
    
    
    ...

如果我只添加 IBActions,一切都会正常运行。但是当我添加 IBOutlet 时,编译器会抛出如下错误:

扩展可能不包含存储的属性

为了修复它,我有两种方法,

    在我的 Objective C 类本身中声明出口 将整个 Objective C 类转换为 Swift 并在其中声明属性

还有其他方法可以解决这个问题吗?

【问题讨论】:

@IBOutlet var image : UIImageView!是这样吗? @IBOutlet var image : UIImageView() 是的,正如编译器所说,你不能在扩展中存储属性,所以你必须使用你的解决方案之一 【参考方案1】:

正如错误消息明确指出的那样,您不能在扩展程序中存储属性。但问题是,你也不能将它们放在 Objective-C 类别中,所以语言不是这里的问题。

在这两种语言中,您都需要使用关联引用来实现存储属性。有关在 Swift 中使用关联引用的示例,请参阅 this thread。由于它是一个 C API,它的用法在 Objective-C 中几乎是一样的。

【讨论】:

以上是关于目标 C 和 Swift 互操作性导致错误“扩展可能不包含存储的属性”的主要内容,如果未能解决你的问题,请参考以下文章

“为不同的目标平台制作的互操作。”和“ActiveX 未正确注册”

Swift 让我对苹果深恶痛绝!

包装 MFC 应用程序(目标移动设备)以创建 dll 以在 c#.NET 中使用以进行互操作

Swift 中的 Realloc UnsafeMutablePointer 导致错误

Fortran 和 c 互操作性

目标 C 到 Swift 错误