swift - 我对 Swift 中的值类型 () 感到困惑。它是什么,我打算如何使用它?
问题描述
我正在尝试将带有小数的英尺高度转换为英尺和英寸的高度。
我正在尝试使用 .round(.down) 方法来获取英尺,并将小数点乘以 12 得到英寸。我遇到了各种各样的错误,比如:
var heightInFeet: Float = 5.45
let feetRounded = heightInFeet.round(.down) // feetRounded is "type ()." What is that?
percentToNextFoot = heightInFeet - feetRounded // Error: Binary operator '-' cannot be applied to operands of type 'Float' and '()'
我尝试了以下方法并得到了另一个错误:
percentToNextFoot = heightInFeet - Float(feetRounded) // Cannot invoke initializer for type 'Float' with an argument list of type '(())'
我终于通过避免使用 .round() 方法让它工作了,但我仍然对值类型 () 感到困惑。谁能解释这里发生了什么?:
var heightInFeet: Float = 5.45
var feet = Int(heightInFeet) // 5
var percentToNextFoot = heightInFeet - Float(feet) // 0.45
let heightInFeetAndInches = "\(feet)ft \(Int(percentToNextFoot * 12))in" // 5ft 5in
解决方案
欢迎来到堆栈溢出!
Double
有两种舍入方法:
Double.round()
,它Double
通过就地变异来舍入一个值。这是你打电话的。它不返回任何东西,严格来说意味着它返回Void
aka()
空元组。Double.rounded()
,它Double
通过返回一个新的值来舍入一个值Double
。这是您可能打算调用的那个。
通过调用第一个,并尝试将值分配给一个变量,您最终会得到一个类型为 的变量Void
,其值为()
。
这是一个常见的 Swift 约定:“object.foo”在原地编辑它。“object.fooed”返回一个变异的副本。
也就是说,在您的情况下,我建议使用现有Measurement
API 执行此操作:
import Foundation
extension Measurement where UnitType == UnitLength {
func toFeetAndInches() -> (feet: Measurement<UnitLength>, inches: Measurement<UnitLength>) {
let numberOfWholeFeet = self.converted(to: .feet).value.rounded(.towardZero)
return (
feet: Measurement(value: numberOfWholeFeet, unit: UnitLength.feet),
inches: Measurement(value: self.value - numberOfWholeFeet, unit: UnitLength.feet).converted(to: .inches)
)
}
}
let heightInFeet = Measurement(value: 5.5, unit: UnitLength.feet)
let (feet, inches) = heightInFeet.toFeetAndInches()
let mf = MeasurementFormatter()
mf.unitOptions = .providedUnit // force the use of feet/inches, rather than the unit appropriate for the user's locale.
mf.unitStyle = .medium
print(mf.string(for: feet)!, mf.string(for: inches)!) // => "5 ft. 6 in."
推荐阅读
- node.js - 将 Angular 应用程序部署到 Heroku 时出现“未找到”错误
- flutter - 颤振 location.altitude 返回 0.0
- ansible - 使用 Ansible nxos_config,我想从 bootflash 中删除一个文件:并发送一个 'y' 但我收到一个错误
- python - 如何查找数组的任何元素是否在pyspark的范围内
- python - 使用 oct2py 执行 .m 并存储在变量中(不将 .mat 存储在磁盘上)
- pandas - 如何在不聚合的情况下将熊猫组翻译为pyspark?
- r - 如何使用 rpy2 从 python 中使用 glmulti?
- reactjs - 如何使用不同的技术在现有网站上配置 react + webpack + babel
- javascript - 将原型 Ajax POST 重建为“普通”js
- reactjs - react js中$q.all的替代品是什么?