我有一个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
并且有这样的事情?
答案 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
} }