簡體   English   中英

如何將 Swift 結構作為參數傳遞給 Objective-C 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM