[英]How to pass a Swift struct as a parameter to an Objective-C method
我有一個接受id
類型參數的 Objective-C 方法,我想將它傳遞給一個 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
並且有這樣的事情嗎?
你不能這樣做。
從Objective-C無法訪問Swift結構。 這在Apple的“使用Swift With Cocoa和Objective-C”一書中有所說明:
只要與Objective-C兼容,您就可以訪問使用@objc屬性標記的類或協議中的任何內容。 這不包括僅限Swift的功能,例如此處列出的功能:
- 泛型
- 元組
- Swift中定義的枚舉
- Swift中定義的結構
- Swift中定義的頂級函數
- Swift中定義的全局變量
- 在Swift中定義的Typealiases
- Swift風格的可變參數
- 嵌套類型
- 咖喱功能
摘錄自:Apple Inc.“將Swift與Cocoa和Objective-C結合使用。”iBooks。 https://itun.es/gb/1u3-0.l
我找到的最好的東西是包裝在Box類中
public class Box<T> {
let unbox: T
init(_ value: T) {
self.unbox = value
} }
補充 Edward Ashak 的答案,我們可以使用以下擴展。 所以在 Objective-C 部分的某個地方可以聲明一個容器屬性:
// An object that holds our Swift struct instance:
@property (nonatomic, strong) NSObject* pocObject;
在 Swift 部分,我們聲明了 struct 本身和一堆助手:
// The struct we are boxing inside pocObject:
struct POCWithCheck: Decodable {
...
}
@objc class POCWithCheckBox: NSObject {
let unbox: POCWithCheck
init(_ value: POCWithCheck) {
self.unbox = value
}
}
extension POCWithCheck {
func asNSObject() -> NSObject {
return POCWithCheckBox(self)
}
}
extension NSObject {
func asPOCWithCheck() -> POCWithCheck? {
return (self as? POCWithCheckBox)?.unbox
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.