OC : NSMeasurement (物理单位换算)

本文详细介绍了如何使用iOS中的NSMeasurement类进行各种物理单位的转换,包括加速度、角度、面积、密度等。通过实例代码展示了单位之间的转换方法,帮助开发者更好地理解和应用这些单位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSUnitAcceleration 加速度单位

苹果的解释是 Base unit - metersPerSecondSquared ,也就是 秒每平方米的意思(㎡/s),学过中学物理都知道这个事加速度的意思,NSUnitAcceleration提供了两个属性

@property (class, readonly, copy) NSUnitAcceleration *metersPerSecondSquared;
@property (class, readonly, copy) NSUnitAcceleration *gravity;

从字面意思来看第一个是 秒每平方米 , 第二个是重力加速度;
那么这东西干啥子用的了 ? 我们打开Apple的API不难发现

NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
[formatter setUnitOptions:NSMeasurementFormatterUnitOptionsProvidedUnit];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh"]];
NSMeasurement *measurement1 = [[NSMeasurement alloc] initWithDoubleValue:12 unit:NSUnitAcceleration.metersPerSecondSquared];
NSMeasurement *measurement2 = [[NSMeasurement alloc] initWithDoubleValue:12 unit:NSUnitAcceleration.gravity];

NSLog(@"%@",[formatter stringFromMeasurement:measurement1]);  // 12米/秒²
NSLog(@"%@",[formatter stringFromMeasurement:measurement2]);  // 12 G

NSMeasurementFormatter : 把指定数字封装成 加速度的,然后按照一定的格式输出。

NSUnitAngle 几何角度单位

Base unit - degrees , degrees 其实是度的意思,eg:这个三角形的角多少度
Apple提供了若干弧度单位如下

@property (class, readonly, copy) NSUnitAngle *degrees;//度(°)
@property (class, readonly, copy) NSUnitAngle *arcMinutes;//分(ʹ)
@property (class, readonly, copy) NSUnitAngle *arcSeconds;//秒(ʺ)
@property (class, readonly, copy) NSUnitAngle *radians;//弧度(rad)
@property (class, readonly, copy) NSUnitAngle *gradians;//百分度制(grad),1G = 直角的1%
@property (class, readonly, copy) NSUnitAngle *revolutions;//转(rev)

我们将90度转成对应的其他单位

NSMeasurement *measurement = [[NSMeasurement alloc] initWithDoubleValue:90 unit:NSUnitAngle.degrees];
NSMeasurement *measurement1 = [measurement measurementByConvertingToUnit:NSUnitAngle.arcMinutes];
NSMeasurement *measurement2 = [measurement measurementByConvertingToUnit:NSUnitAngle.arcSeconds];
NSMeasurement *measurement3 = [measurement measurementByConvertingToUnit:NSUnitAngle.radians];
NSMeasurement *measurement4 = [measurement measurementByConvertingToUnit:NSUnitAngle.gradians];
NSMeasurement *measurement5 = [measurement measurementByConvertingToUnit:NSUnitAngle.revolutions];

NSLog(@"%f",measurement1.doubleValue);  // 5399.892002
NSLog(@"%f",measurement2.doubleValue);  // 323997.408021
NSLog(@"%f",measurement3.doubleValue);  // 1.570796
NSLog(@"%f",measurement4.doubleValue);  // 100.000000
NSLog(@"%f",measurement5.doubleValue);  // 0.250000

其实我们不难看出这个NSMeasurement的使用方法,即先初始化一个数值对应单位,然后在通过这个单位转成另外一个单位并获取值,为神马90度转分秒之后不是整数了?
我觉得这种问题我在这里就不用解释了 90° == π/2 rad , 90° == 100grad , 90° == 0.25rev

NSUnitArea 面积单位

Base unit - squareMeters ,基础单位平方米

@property (class, readonly, copy) NSUnitArea *squareMegameters;//平方表  Megameter兆米(=100万米) 
@property (class, readonly, copy) NSUnitArea *squareKilometers;//平方千米
@property (class, readonly, copy) NSUnitArea *squareMeters;//平方米
@property (class, readonly, copy) NSUnitArea *squareCentimeters;///平方厘米
@property (class, readonly, copy) NSUnitArea *squareMillimeters;///平方毫米
@property (class, readonly, copy) NSUnitArea *squareMicrometers;///平方微米
@property (class, readonly, copy) NSUnitArea *squareNanometers;///平方纳米
@property (class, readonly, copy) NSUnitArea *squareInches;///平方英寸
@property (class, readonly, copy) NSUnitArea *squareFeet;///平方英尺
@property (class, readonly, copy) NSUnitArea *squareYards;///平方码
@property (class, readonly, copy) NSUnitArea *squareMiles;///平方英里
@property (class, readonly, copy) NSUnitArea *acres;///英亩
@property (class, readonly, copy) NSUnitArea *ares;///公亩(等于100平方米)
@property (class, readonly, copy) NSUnitArea *hectares;///公顷

同样需要来一段代码验证码:

NSMeasurement *measurement = [[NSMeasurement alloc] initWithDoubleValue:100000 unit:NSUnitArea.squareMeters];
NSMeasurement *measurement1 = [measurement measurementByConvertingToUnit:NSUnitArea.squareKilometers];
NSMeasurement *measurement2 = [measurement measurementByConvertingToUnit:NSUnitArea.squareCentimeters];
NSMeasurement *measurement3 = [measurement measurementByConvertingToUnit:NSUnitArea.squareFeet];
NSMeasurement *measurement4 = [measurement measurementByConvertingToUnit:NSUnitArea.ares];
NSMeasurement *measurement5 = [measurement measurementByConvertingToUnit:NSUnitArea.hectares];

NSLog(@"%f",measurement1.doubleValue);  // 0.100000
NSLog(@"%f",measurement2.doubleValue);  // 1000000000.000000
NSLog(@"%f",measurement3.doubleValue);  // 1076391.505118
NSLog(@"%f",measurement4.doubleValue);  // 1000.000000
NSLog(@"%f",measurement5.doubleValue);  // 10.000000

NSUnitConcentrationMass 单元集中质量(密度)

Base unit - gramsPerLiter ,这个名字的确略显抽象,其实用我们物理的话来说就是 密度 ,简直就是坑爹,来张图

首先看下这个货给我们提供了神马

@property (class, readonly, copy) NSUnitConcentrationMass *gramsPerLiter; //克每升
@property (class, readonly, copy) NSUnitConcentrationMass *milligramsPerDeciliter;//毫克每分升

+ (NSUnitConcentrationMass *)millimolesPerLiterWithGramsPerMole:(double)gramsPerMole; // 毫摩尔每升克每摩尔

使用方法 :

NSMeasurement *measurement1 = [[NSMeasurement alloc] initWithDoubleValue:7890 unit:NSUnitConcentrationMass.gramsPerLiter];

NSMeasurement *measurement2 = [measurement1 measurementByConvertingToUnit:NSUnitConcentrationMass.milligramsPerDeciliter];

NSLog(@"%f",measurement1.doubleValue);  // 7890.000000
NSLog(@"%f",measurement2.doubleValue);  // 789000.000000

这个是两个单位之间的转换,那么这个货不老实,提供了一个类方法
来段代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值