2016-02-11 43 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

相關問題