无法延长Swift Enum

时间:2017-01-05 14:59:48

标签: swift enums

我有以下基础枚举:

enum Voicity {}

在各种不同的文件中,我扩展了上面的枚举,以存储我的应用程序作为中心站使用的各种功能和信息。

例如,我使用此枚举以编程方式创建我的UI元素。

extension Voicity {
    enum sectionObject {
        case textField(ofType: Voicity.UIElement.textField)
        case button(ofType: Voicity.UIElement.button)
        case label(ofType: Voicity.UIElement.label)
        case line()
        case photoCircle
        case stackView(_: UIStackView)
        case view(_: UIView)

        var item: UIView {
            switch self {
            case .textField(let type):
                return createTextField(ofType: type)
            case .label(let type):
                return createLabel(ofType: type)
            case .line():
                return createLine()
            case .photoCircle:
                return createPhotoCircle()
            case .stackView(let view):
                return view
            case .view(let view):
                return view
            case .button(let type):
                return createButton(ofType: type)
            }
        }
    }
}

为了便于阅读/维护,我将上面返回的函数分离为单独的文件,并再次扩展sectionObject枚举。

extension Voicity.sectionObject {
    func createLabel(ofType type: Voicity.UIElement.label) -> UILabel {
      // implementation here
    }
}

以上工作正常,但当我尝试声明createButton()

extension Voicity.sectionObject {
    func createButton(ofType type: Voicity.UIElement.button) -> UIButton {
      // implementation here
    }
}

我收到以下错误:

sectionObject is not a member of Voicity

为什么我不能在一个文件上扩展我的枚举?我可以在另一个文件中这样做?

更新

createButton()createLabel()方法都在组/文件夹Model内。

枚举声明位于组/文件夹Store内。

所以,他们是分开的。但令我感到惊讶的是createLabel()createButton()无法正常工作时才能正常工作。

当我的枚举案例再次出现在组/文件夹Store下的单个文件和组/文件夹Model下的方法时,这一切都已经过去了(方法在不同的文件中)。当他们放大时我需要重构我的枚举案件。

此外,我刚刚尝试在声明createButton()的扩展程序中移动createLabel()。这一切都有一定原因。

以前,我删除了声明createButton()方法的文件并重新创建它,一切都是一样的。因此,它不是一些奇怪的Xcode解析问题。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案here(nkukushkin的回答)。

问题

我认为这是一个编译顺序问题,但我认为Xcode会自动处理它。因此我甚至懒得去我的项目设置。事实证明,它可能并不总是如此。

如何解决

  1. 选择您的项目
  2. 选择目标,
  3. 转到目标Build Phases
  4. 延长Compile Sources
  5. Xcode Project Settings | Target Build Phases | Compile Sources

    在这里,您将看到项目中正在编译的文件列表。

    在我的情况下,我最初定义的文件sectionObject列在我扩展枚举的文件下面。因此,我不得不将定义文件移到顶部,以便扩展程序可以看到它。

    不幸的是,Xcode(8.2.1(8C1002))不允许拖放。我必须删除该文件,然后通过Compile Sources列表下方的加号/减号重新添加该文件。重新添加后,它会列在顶部。