2017-07-15 63 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

相关问题