当前位置: 首页 > 面试题库 >

由于Swift缺乏CGFloat的隐式转换而造成的混乱

蓝慈
2023-03-14
问题内容

尝试在返回`CGFloat’的函数中进行算术运算,出现错误:

找不到接受提供的参数的’/’的重载

func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{ 
     return (M_PI * (x) / 180.0) // error is here. 
}

其他人看到过这种类型的问题吗?


问题答案:

这是一个问题double,以float转换。

在64位计算机上,CGFloat定义为double并且您将编译它而不会出现问题,因为M_PIx都是双精度。

在32位计算机上,CGFloat是,floatM_PI仍然是两倍。不幸的是,Swift中没有隐式强制转换,因此您必须显式强制转换:

return (CGFloat(M_PI) * (x) / 180.0)

180.0文字的类型被推断。

在Swift 3中

M_PI已弃用,请CGFloat.pi改用:

return (x * .pi / 180.0)


 类似资料:
  • 问题内容: 我只是注意到Swift的成员是隐式的。 例如,这只会调用一次: 这背后的原理是什么? 如果我想要相反的行为怎么办? 问题答案: 该属性定义了一个“类型属性”,该属性仅被实例化一次。正如您所注意到的,这是懒惰发生的,因为静态行为就像全局变量一样。正如Swift编程语言:属性所说: 全局常量和变量总是以与惰性存储属性类似的方式延迟计算。与惰性存储的属性不同,全局常量和变量不需要用修饰符标记

  • 问题内容: 如果能解决问题,请使用原始的Objective-C代码。 我从这段代码开始。第2行和第3行很好,稍后我将对其进行介绍。 在Xcode 6 beta 3中,必须将arc4random_uniform UInt32结果强制转换为CGFloat,以便减号和乘法起作用。这不再起作用,并且编译器显示错误: “ CGFloat”不可转换为“ UInt8” 发行说明指出: “ CGFloat现在是一

  • 以下代码在C++11中编译成功: 它包括用于现代C++的JSON。一个工作示例在这个Wandbox中。 JSON变量被隐式转换为字符串。但是,如果我取消最后一行的注释,这是一个显式转换,它将无法编译。这里的编译结果。 除了这个json库的特殊细微差别之外,如何编写一个类,使隐式转换工作,而显式转换不工作? 是否有某种构造函数限定符允许这种行为?

  • 一、隐式转换 1.1 使用隐式转换 隐式转换指的是以 implicit 关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能。示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hamm

  • 问题内容: “隐式转换”和“显式转换”有什么区别?Java和C ++的区别是否不同? 问题答案: 显式转换是您使用某种语法 告诉 程序进行转换的地方。例如(在Java中): 隐式转换是在没有任何语法的情况下进行转换的地方。例如(在Java中): 应该注意的是(在Java中)涉及原始类型的转换通常涉及某种表示形式的更改,并且可能导致精度降低或信息丢失。相比之下,仅涉及引用类型的转换不会更改基本表示形