gpt4 book ai didi

未在返回类型中推断出 Swift LiteralConvertible

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:44 25 4
gpt4 key购买 nike

我 90% 确定这是预期的行为,但在那种情况下,我只想接受教育!

在我的项目中,我定义了一个符合 IntegerLiteralConvertible 协议(protocol)的温度结构:

struct Temperature {
var kelvin: Int
var celcius: Int { get { ... } }
var fahrenheit: Int { get { ... } }
}

extension Temperature: IntegerLiteralConvertible {
init(integerLiteral value: IntegerLiteralType) {
kelvin = value
}
}

现在一切都像我在创建温度实例时所期望的那样工作:

let absoluteZero: Temperature = 0 

但是,如果我在定义为返回 Temperature 的函数中返回 Int,即

func randomTemperature() -> Temperature {
return random()
}

我会收到错误消息:“无法将类型为‘Int’的返回表达式转换为返回类型‘温度’

直觉上,我希望返回的类型 Temperature 是从 Int 推断出来的,因此是 IntegerLiteralConvertible。

在文档(或现在开放源代码 :D!)中仔细研究了一下,我发现 Int 结构符合从 IntegerLiteralConvertible 继承的 SignedNumberType。我怀疑问题的答案与此有关。

那么,为什么?

提前致谢! (在此期间我会继续挖掘)

最佳答案

经过上面评论的一些讨论,我意识到你想问的是:

  • 考虑到我的结构的上下文,包括它的扩展,当我尝试发送一个 int 值属性作为返回值时,为什么 randomTemperature() -> Temperature 方法失败类型?

在代码中:

func randomTemperature() -> Temperature {
let anyInt = 1
return anyInt
// Error: "Cannot convert return expression of
// type 'Int' to return type 'Temperature'
}

简短的回答是:您不能将类型“Int”转换为返回类型Temperature'(作为错误状态)。你问你的初始化器呢? Temperature: IntegerLiteralConvertible 初始化函数 init(integerLiteral value: IntegerLiteralType) 仅适用于literals (IntegerLiteralType),并且整数不是文字。

要获得更详尽的答案,请参阅下文。


来自 Apple`s documentation on literals , 它说

A literal is the source code representation of a value of a type, such as a number or string.

...

A literal doesn’t have a type on its own. Instead, a literal is parsed as having infinite precision and Swift’s type inference attempts to infer a type for the literal.

...

When specifying the type annotation for a literal value, the annotation’s type must be a type that can be instantiated from that literal value. That is, the type must conform to one of the following Swift standard library protocols: IntegerLiteralConvertible for integer literals ...

来自 Apple 关于 IntegerLiteralConvertible 协议(protocol)的文档:

Conforming types can be initialized with integer literals.

好吧,文字从来没有自己的类型。这解决了问题。

考虑 Temperature 结构中的 Double 类型,该类型也符合 IntegerLiteralConvertible

对于Double,我们有:

func someDouble() -> Double {
return 1 // This is ok, "1" here is a literal, and the return
// of type Double can be initialised via the literal
}

func someDoubleTrouble() -> Double {
let anyInt = 1
return anyInt // Error! anyInt is not a literal, but an Int type,
// and return typ expects Double (or literal).
}

// The same applies for these
var someInt = 1
var anotherDouble: Double = 1 // ok, as above, literal
var anotherDoubleTrouble: Double = someInt // Error!

完全相同的方法适用于您的 Temperature 结构类型。

func someTemperature() -> Temperature {
return 1 // Ok
}

func someTroubledTemperature() -> Temperature {
let myInt = 1
return myInt // Error!
}

// The same applies for these
var someInt = 1
var anotherTemperature: Temperature = 1 // ok, as above, literal
var anotherTroubledTemperature: Temperature = someInt // Error!

关于未在返回类型中推断出 Swift LiteralConvertible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com