我试图通过保持方法和文件尽可能短并使用嵌套类进行命名空间来保持我的代码尽可能可读.除了一些非常奇怪的时刻,它工作正常.
我有一些用于命名空间的类.
class Space { }
在该文件中使用的所有类都在它们自己的文件中作为扩展实现.
extension Space { class SomeClass { // implementation } }
其中一个SomeClasses有许多相当复杂的初始化程序,所以我也将它们拆分为自己的文件并按如下方式实现:
extension Space.someClass { convenience init(fromSomeSource source: SourceClass) { self.init() // other implementation } }
问题是这些文件中的一些工作正常,但其中一些抛出’SomeClass’不是’Space’的成员类型,我不知道为什么.
所有这些都很相似.唯一的区别是初始化程序本身的实现.所有文件都保存在同一个地方,我不知道为什么有些文件工作正常,有些则没有.
我试图将代码从不工作的文件转移到工作正常的文件中 – Xcode同意看到代码并且没有反对它.但是当相同的代码位于自己的文件中时 – Xcode或编译器不想理解SomeClass确实是Space的成员.
我试图清理构建,包括手动转储〜/ Library / Developer / Xcode / DerivedData文件夹.什么都没有帮助.
当然,我可以将它全部放在一个文件中,它可以正常工作,但是在我的情况下它如此挑剔的原因是什么?
我试图创建一个新文件,并从其中一个坏文件中移动所有内容.它可以工作,但只能使用某些文件名.有些名称再次出现相同的错误,但似乎如果名称是全新的并且与现有名称不相似 – 它可以正常工作.魔法?
解决方法
我遇到过类似的问题,似乎编译器正在尝试处理扩展嵌套类的文件,在嵌套类定义之前.因此,您有此错误说该Space没有成员SomeClass.
我发现的解决方案是转到目标设置,打开Build Phases.
在“编译源”部分中,您应该将用于定义嵌套类的文件放在扩展它的文件上.
这个解决方案似乎甚至可以很好地与您的观察结果一致,当您重新创建文件时,它有时会编译,因为当您重新创建文件时,它在编译源中的位置会发生变化.