目标 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
的类,我想在其中添加一些新的 IBAction
s 和 IBOutlet
s。为此,我添加了一个新的 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 未正确注册”
包装 MFC 应用程序(目标移动设备)以创建 dll 以在 c#.NET 中使用以进行互操作