2016-02-11 49 views
-2

我有一对夫妇的斯威夫特文件,其中每个属于在iOS和OS X的目标:什么会导致不同文件中的Swift func无法解析iOS?

文件

public func doThing() { 
    let constant: CustomValue? = otherThing { 
     //... 
    } 
} 

文件B

public func otherThing(block:() -> Void) -> CustomValue? { 
    //... 
} 

当我编译并运行OS X,它会很好。编译为iOS,不过,抱怨的文件:

使用未解决的标识符“otherThing”

要解决问题,我实现的otherThing()存根在文件上面doThing()。文件编译,但我得到这个错误文件B:

的“otherThing”

重复宣告无效现在,如果它没有在文件中解决这个问题,怎么能“重新声明“在文件B?我怎样才能让文件A从文件B中解析otherThing

要查看我遇到的具体项目,请查看on GitHub(修订917be3b8175576ae7e0c6275d388718fcc465040)。你只需要克隆(递归的,因为有一个子模块)并构建iOS方案。

+0

这意味着你在两个地方说'func otherThing'。你不能那样做。 – matt

+0

@matt我的目标不是重新声明'otherThing',而是从文件A中解析出来。我已经更新了这个问题,使其更加清晰。 – Dov

+0

你不需要做任何事情来让事情从一个文件“解析”到另一个文件。所有文件顶层的所有文件都会在同一模块中的所有其他文件中自动显示。 – matt

回答

1

的问题是,所述catchBadInstruction函数被声明/条件编译块内定义:

#if arch(x86_64) 
// ... 
public func catchBadInstruction(block:() -> Void) -> BadInstructionException? { 
    // ... 
} 
// ... 
#endif 

在iOS上,因此,它不编译和不存在。

一看就知道这是事实,声明 - 条件编译块 - 这样的存根:在结束

public func catchBadInstructionn(block:() -> Void) -> BadInstructionException? { 
    return nil 
} 

注意,它有一个不同的名称(二“N” S它的名字),所以我们不会得到“重新声明”的错误。现在回到ThrowAssertion.swift并更换了电话呼叫到功能:

let caughtException: BadInstructionException? = catchBadInstructionn // ... 

它编译罚款 - 因为catchBadInstructionn存在和看到的,因为它不是条件编译块内。如果将移动到的条件编译块中,编译失败的方式与以前完全相同,证明条件编译确实是问题所在。

+0

谢谢,这确实解释了它。但奇怪的是,即使在构建> = iPhone 5s模拟器时,我也会得到这个模拟器,它应该是x86_64 ... – Dov

+0

不过,您并不是只针对x86_64进行编译。无论如何,我觉得我已经证明我的答案是正确的,所以我希望你会接受它。 – matt

相关问题