【问题标题】:Swift String format vs Objective-CSwift 字符串格式与 Objective-C
【发布时间】:2018-08-12 09:22:51
【问题描述】:

我正在使用 swift String(format:...) 并且需要使用三元运算符计算格式字符串本身的值,类似这样但它不会编译。

 String(format: "Audio: \(numChannels>1?"Stereo": "Mono")")

在 Objective-C 中,我可以这样做:

 [NSString stringWithFormat:@"Audio: %@",  numChannels > 1 ? @"Stereo" : @"Mono"];

如何在没有中间变量的情况下在 Swift 中实现同样的优雅?

【问题讨论】:

  • 请注意,您的 Objective-C 版本计算格式字符串本身的值。格式是固定的,参数计算字符串。
  • @MartinR 没错,但在 Swift 中我可以计算值,例如格式字符串本身的 '\(sampleRate/1000)'。
  • 也许你的意思是字符串插值:let s = "Audio: \(numChannels > 1 ? "Stereo" : "Mono")"
  • 您的 Swift 代码无法编译的原因是 ?: 周围缺少空格
  • 你甚至可以在没有String(format和没有字符串插值的情况下组成字符串:"Audio :" + (numChannels > 1 ? "Stereo" : "Mono")

标签: objective-c swift string stringwithformat


【解决方案1】:

由于条件表达式中运算符周围缺少空格,编译器将1?"Stereo" 误解为可选链接。应该是

String(format: "Audio: \(numChannels>1 ? "Stereo" : "Mono")")

相反。但是,由于格式字符串根本没有占位符,这相当于

"Audio: \(numChannels > 1 ? "Stereo" : "Mono")"

【讨论】:

    【解决方案2】:

    一种选择是使用带有占位符的 String(format:) 和条件表达式作为占位符的参数

    String(format: "Audio = %@", numChannels > 1 ? "Stereo" : "Mono")
    

    【讨论】:

    • Swift 字符串应该是%@
    • 是的,我意识到了
    • @DeepakSharma,来自 Objective-C 的 %@ 遗产是因为 String(format:) 不是纯 Swift,而是来自 Foundation 框架。请注意,您必须导入 Foundation(或 UIKit 或 AppKit 或 Cocoa)才能使用它。所以"Stereo""Mono" 被传递为NSString
    • 为什么这被否决了?它按预期工作,是几种有效的解决方案之一。
    • 通过一些解释改进了纯代码答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多