X不是Y的成员类型

时间:2015-12-08 15:15:58

标签: xcode swift

我在swift项目中盯着模块名称间距问题。

我在一个新项目中试过这个,一切正常:

我有2个模块,其中包含相同的类名,我可以从Module.Class引用该类没问题。

我有一个现有的快速项目,我无法让这个工作。我一直收到错误

enter image description here

因此,您可以看到我是否尝试 Module-Scope 该课程一切正常。

(是的,我已经尝试过.Type添加了。

所以我假设我的编译器设置中有一些关闭。我唯一能想到的是我的LocationMessage类不在主DataManager"类"中定义。文件,而是在不同的文件中。

但我真的无法做出正面或反面的事情。有什么建议吗?

项目结构

框架:DataManager

  • DataManager.swift
  • LocationMessages.swift

框架:ReferenceTest

  • File.swift

所以我的问题在于File.swift我尝试引用LocationMessages.swiftDataManager.framework内定义的类 IS public < / p>

@objc(DMLocationMessage)
final public class LocationMessage : ParsedMessage {

5 个答案:

答案 0 :(得分:4)

您的代码中可能有class/struct/enum DataManager隐藏DataManager模块。该错误表明它无法在类型 LocationManager中找到DataManager,而应该在其中读取模块

您的应用模块应该以某种方式设计,除了import语句之外,您永远不需要显式使用模块的名称。所以直接使用LocationMessage.Type而不说明模块。

这是所有我们的应用模块前缀为X的一个原因,例如XDataManager。这避免了与Apple的模块,外部模块(如来自CocoaPods)和类型(如您的情况)的冲突。
X也明显表明这些模块是应用程序本身的一部分,而不是某些第三方框架。

答案 1 :(得分:3)

如果使用 xcframework ,请按照以下步骤摆脱错误:

  1. 在终端中,转到.xcframework所在的文件夹。
  2. frameworkName 替换为您的框架名称后,运行以下终端命令:

查找。 -name“ * .swiftinterface” -exec sed -i -e 's / frameworkName \ .// g'{} \;

  1. 用上述命令生成的xcframework替换项目中的旧xcframework。清洁构建项目。

仅当xcframework命名的类与模块名称相同时,才发生上述错误。有关Apple论坛的详细信息,请访问:https://forums.developer.apple.com/thread/123253

答案 2 :(得分:1)

当使用依赖于另一个框架的 xcframework 时,.withAttributes(ActorAttributes.supervisionStrategy(Supervision.resumingDecider)) 也会发生在它依赖于编写包装了扩展的扩展的框架上,例如委托方法

示例: Framework Foo依赖Bar,需要符合DataDelegate。

X is not a member of type Y

编译期间的所有操作都会按计划进行,并且将生成xcframework。将其与依赖框架Bar一起添加到您的应用程序并尝试对其进行构建后,您将获得class Foo { ... } extension Foo : Bar.DataDelegate { ... }

答案 3 :(得分:0)

万一有人在尝试构建和使用xcframework时,显然,当您在框架中有一个与模块/框架同名的类时,就会引起问题。

这是一个已知问题,需要here所述的解决方法。

P.S。 -我知道这本身并不能回答这个问题。只是将其留在这里,以便任何可能因问题标题而落在这里的人。

答案 4 :(得分:0)

有一个解决方法! ?

你应该

  1. 创建一个新的空 swift 文件
  2. 仅导入您需要使用的类型(而不是整个模块):
/* import MyModule */ // NOT THIS!

import enum MyModule.Theme // This will only import the `enum`.  You can use this method for `class`, `structs` and others too.
  1. 为导入的类型创建一个 typealias
typealias MyUniqueName = MyModule.Theme
  1. 使用您刚刚创建的新的唯一名称。

这是编译器准确理解您的意思的唯一解决方法(无需更改内部模块名称。


结果

记住最终文件将只包含两行:

import enum MyModule.Theme
typealias MyUniqueName = MyModule.Theme