【问题标题】:getting Swift Object from Objective C class using another Swift File使用另一个 Swift 文件从 Objective C 类中获取 Swift 对象
【发布时间】:2017-11-07 10:06:28
【问题描述】:

我一直在尝试以下结构,但没有成功:

ClassA.swift

class ClassA:NSObject{
   var varA = ""
}

然后我有一个 ClassB.hClassB.m(目标 c),我无法在 .h 中定义“Project-Swift.h”文件,所以我将它导入到 .m

@interface ClassB()
    @property ClassA *myClassA;
@end

@synthesize myClassA = theAClass;

当我尝试时问题来了

class ClassC:NSObject{
   let theClassAFromC = ClassB.myAClass
}

我收到一条错误消息“ClassB”类型的值没有成员“theClassA”

【问题讨论】:

  • 你是否创建了桥接头..?
  • 是的,我做到了。这就是为什么可以访问objective c类,对吧?
  • 你的前两个步骤是正确的 Swift -> Objc using Project - Swift .h 文件但是在 C 类中你正在访问 Objc -> Swift 为此你需要创建桥接头并在那里导入 Class B
  • 感谢您的回答,但我已经这样做了。我的属性和方法在 .h 中,我没有问题,但由于我无法导入 Project-Swift.h,所以我在 .m 中声明了属性。它似乎是“私人的”,无法访问

标签: objective-c swift xcode


【解决方案1】:
  1. 将您的 objc 标头添加到桥接头中
  2. 在您的 objc 标头中,为您的 swift 类使用 @class 表示法,例如@class ClassA;,而不是导入“Project-Swift.h”文件。你可以在你的 objc 实现文件中导入那个。
  3. 不要忘记,您不能按照您声明的方式访问 objc 类的非静态属性。相反,在您的 swift 类中初始化您的 ClassB 对象,并在需要时访问它的属性。为了实例化 ClassA 对象,您可以在 ClassB 中使用依赖注入
  4. 为方便起见,请使用 @objc 声明可访问 objc 运行时的 Swift 类

【讨论】:

  • 非常感谢,这就是我想知道的。虽然我在某处看到它,但我认为我可以使用桥接文件。项目有很多客观的c代码,分部分更新比较好。
  • 很高兴为您提供帮助!快乐编码 ;)
  • 还有一件事。我在 B 类中声明了一个 ClassA 属性,当我尝试从 ClassA 中实现 ClassB 中的任何方法时,我收到以下消息“接收器类型 'ClassA' 例如消息是前向声明”
  • 您必须在 Class B 的实现文件中导入 Swift 的预编译头文件 -> "Project-Swift.h" - 这样在 ClassA 上所做的所有声明也对 ClassB 可见。如果问题仍然存在,请检查生成的“Project-Swift.h”头文件并找到 ClassA 的声明。查看您尝试访问的所有属性/方法是否也可用于 Objective-C 对应对象。
  • 有效!这正是我所需要的!再次感谢您
【解决方案2】:

尝试用关键字"Bridging-Header"搜索,然后添加

#import "ClassB.h"

这在我的情况下不起作用。

在我的 Bridge 文件中添加 ClassB.h 会使 .h 中的属性可见,但我的 .m 文件中的属性不可见。如果我在头文件中添加 Class.m 则找不到 Module-Swift.h

【讨论】:

  • 那行不通。我将属性声明为 .m 文件。如果我将 .h 添加到 Bridging-Header.h 中,它仍然找不到。我尝试了一个目标 c 项目,如果 import classB.m 它找到了属性,但没有找到 Project-Swift.h
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多