2017-07-15 67 views
1

可能看起來像一個奇怪的問題,但忍受着我。我寫了一個函數:在Swift 3中它實際上可以測試返回類型的Void(aka())

func togglePlay() { 
    if _musicPlayer.isPlaying { 
     _musicPlayer.pause() 
    } else { 
     _musicPlayer.play() 
    } 
} 

這一工程,但我認爲,有關使用三元操盤手,如果聲明的內容:

_musicPlayer.isPlaying ? _musicPlayer.pause() : _musicPlayer.play() 

,提供有關不匹配類型的編譯器錯誤 - 暫停()返回Void,play()返回Bool。所以我需要以某種方式將返回類型的pause()轉換爲Bool(測試Void)。我猜想替代方案可能是:

  1. 將play()的返回類型轉換爲Void。
  2. 使用三元運算中的多個語句暫停後添加一個布爾聲明()

顯然,如果這是不可能的,那麼我有一個有效的解決方案,但它的感覺就像有可能是雨燕的一部分我不知道的語法。

+0

作爲跟進,我可以實現我想要的: '_musicPlayer.isPlaying? _musicPlayer.pause():(_ = _musicPlayer.play())' 有效地吞噬Bool返回值。 從技術上講,這並不能回答我的問題。 –

回答

0

它被稱爲三元運營商有一個原因,其目的是爲了返回一個值。這是表達式的世界的一部分,它是計算值的程序結構。

if語句選擇執行兩個語句,它不會返回一個值而是一個操作。

這是一些語言,稱爲面向表達式,其中傳統上語句構造是返回值的表達式。斯威夫特不是其中之一。

你沒有錯過Swift中的任何東西,但正如你發現你可以濫用語言來對待三元運算符像條件語句 - 但爲了清晰起見,最好不要這樣做。

+0

我同意這是一個濫用 - 不能是一個完整的濫用,因爲它編譯和工作,但肯定是對三元精神:) 我正在學習Swift的過程中,所以嘗試新的語法元素因爲我發現它們。鑑於Swift的本質,我很驚訝像()==()這樣的測試是無效的,所以這是我真正的問題 - 是否可以測試Void aka()的返回值。 –

+1

@ ad-johnson'Void'的'=='重載是未來版本的語言 - https://github.com/apple/swift/pull/8354。雖然我不確定自己在這種情況下如何應用它,但唯一值'Void'可以是'Void'。 – Hamish

+1

@Hamish - OP可以輕鬆使用它。它們在三元組中有一個Bool/Void衝突,您提到的即將到來的'=='重載將應用於Void返回一個Bool,因此可以解決衝突。因此,整個構造將應用一個額外的運算符'==',以啓用(三)使用三元... – CRD

相關問題