如何将Swift结构作为参数传递给Objective-C方法

时间:2015-02-17 17:27:13

标签: objective-c swift struct

我有一个Objective-C方法,它接受id类型的参数,我想传递一个Swift结构。

ObjcClass.m档案:

@implementation ObjcClass
+ (void)addListener:(id)listener {
    // Do something with listener
}

DemoStruct.swift档案:

struct DemoStruct {
    func registerAsListener() {
        ObjcClass.addListener(self) // Can't find a way to do this
    }
}

我得到的编译错误消息:

  

键入' DemoStruct'不符合协议' AnyObject'

所以我的问题是,如何让Objective-C方法接受Any而不是AnyObject并且有这样的事情?

2 个答案:

答案 0 :(得分:12)

你不能这样做。

无法从Objective-C访问Swift结构。这在Apple的“使用Swift With Cocoa和Objective-C”一书中说明:

  

只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容。这不包括仅限Swift的功能,例如此处列出的功能:

     
      
  • 泛型
  •   
  • 元组
  •   
  • Swift中定义的枚举
  •   
  • Swift中定义的结构
  •   
  • Swift中定义的顶级函数
  •   
  • Swift中定义的全局变量
  •   
  • Swift中定义的Typealiases
  •   
  • Swift式variadics
  •   
  • 嵌套类型
  •   
  • 咖喱功能
  •   

摘自:Apple Inc.“将Swift与Cocoa和Objective-C一起使用。”iBooks。 https://itun.es/gb/1u3-0.l

答案 1 :(得分:11)

我发现的最好的事情是包装在Box类

public class Box<T> {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    } }