如何将Float64分配给NSInteger变量?

时间:2018-12-08 19:51:08

标签: objective-c

此功能如何工作?

- (NSInteger)selectFpsForFormat:(AVCaptureDeviceFormat *)format {
  Float64 maxSupportedFramerate = 0;
  for (AVFrameRateRange *fpsRange in format.videoSupportedFrameRateRanges) {
    maxSupportedFramerate = fmax(maxSupportedFramerate, fpsRange.maxFrameRate);
  }
  return fmin(maxSupportedFramerate, kFramerateLimit);
}

因为return fmin(maxSupportedFramerate, kFramerateLimit);是float64而不是NSInteger吗?

2 个答案:

答案 0 :(得分:3)

因为Objective-C是C,并且C specification声明:

  

6.3转换

     

6.3.1算术操作数

     

6.3.1.4实数浮点数和整数

     

1当将实数浮点型的有限值转换为_Bool以外的整数类型时,小数部分将被丢弃(即,该值将被截断为零)。如果整数部分的值不能用整数类型表示,则行为是不确定的。

另请参阅return语句的定义,以了解在这种情况下为什么要应用算术转换:

  

6.8.6.4 return语句

     

3如果执行了带有表达式的return语句,则表达式的值将作为函数调用表达式的值返回给调用方。如果该表达式的类型不同于它所出现的函数的返回类型,则该值的转换就好像是通过分配给具有该函数的返回类型的对象一样。

然后继续阅读6.5.16.1.3简单分配...。您可以继续深入规范的深度,并随心所欲。 :D

但是关键点是,在C语言中,浮点值可以隐式转换为整数,并且有指定的方式可以转换thy。

答案 1 :(得分:0)

为更清楚起见,您可以添加显式强制转换:

return (NSInteger)fmin(maxSupportedFramerate, kFramerateLimit);

但这并不能改变行为,因为它将如Rob所解释的那样自动完成。