【问题标题】:Short-circuit when using a Swift protocol使用 Swift 协议时发生短路
【发布时间】:2015-10-16 06:21:55
【问题描述】:

众所周知,不能在 -Header.h 中包含来自文件的接口头文件。 我的实际问题是我定义了一个类 1 协议,它是一个 Swift 协议:

@protocol arrivingDelegate;

@interface palettaTraffic : NSObject<MKMapViewDelegate, arrivingDelegate> {
}

如果我导入 *-Swift.h 文件,当该文件包含在另一个包含在头文件中的文件中时,我会陷入丑陋的循环。

当我使用@protocol 指令时会发生这种情况:这是一个警告,但也很令人不安。

这是 swift 协议的定义方式:

@objc public protocol arrivingDelegate {
    func submitManualBusLine(busStripe:StripeProtocol)
}

我还发现了一个类似的帖子: Swift protocol in Objective-C class

但似乎没有任何建议适用。

【问题讨论】:

  • 跟上课一样:@protocol StripeProtocol;
  • 我为在一个特定情况下使用@protocol 指令时发生的警告添加了屏幕截图。那个可能说服我我不能使用这项技术的人。然而,出于某种原因,它在其他文件中运行良好。

标签: ios objective-c swift protocols


【解决方案1】:

我在我的项目中倾向于将 ObjC 类的协议一致性放在一个 Swift 文件中,以避免这个错误。通常是定义协议的文件。

extension PalettaTraffic: ArrivingDelegate {}

为什么?我们正在将我们的代码库从 ObjC 迁移到 Swift,但我们不能同时迁移每个类。正因为如此,我们在 Swift 和 ObjC 之间有一个很大的“似乎”,其中 Swift 类型需要 ObjC,反之亦然。对我来说,这是立即产生最少工作量的解决方案。

【讨论】:

    【解决方案2】:

    在 Objective-c 中采用 swift 协议是一个棘手的过程。我也通过将采用类移植到 Swift 解决了这个问题。

    【讨论】:

      【解决方案3】:

      如果我导入 *-Swift.h 文件,当该文件包含在另一个包含在头文件中的文件中时,我会陷入丑陋的循环。

      好的,但这是你必须做的。我没有看到您在上面的屏幕截图中执行此操作,这就是看不到您的协议的原因。

      “丑陋循环”的解决方案应该只是调整在各种 Objective-C 文件中导入内容的顺序

      【讨论】:

      • 我发布了修改后的屏幕截图,其中错误已变成警告。
      • 之所以没有比警告更糟糕的原因是@protocol 指令仅仅意味着“相信我,编译器,有这样的协议。”所以编译器确实信任你,果然,在运行时你说的是实话。但你肯定更愿意最终摆脱所有警告。
      • 我知道这个故事,但最终在链接时所有部分都应该按顺序返回。我忽略了为什么这个特定问题没有。如果这件事持续下去,我也将把该课程翻译成 Swift。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      相关资源
      最近更新 更多