【问题标题】:Casting an Int as a String from a Realm result Swift从领域结果 Swift 中将 Int 转换为字符串
【发布时间】:2018-11-26 04:25:25
【问题描述】:

我很犹豫地问这个问题,因为我知道这可能是一个愚蠢的问题。

我正在返回一个领域结果,然后继续尝试将其转换为正常的字符串(放入文本标签)。

但是我收到了一个错误'init' has been renamed to 'init(describing:)'

当我尝试改用描述方法时,标签会在其中打印"Optional",这显然不是我想要的。

我不能使用有什么原因吗:

previousTimeLabel.text = String(lastRecord?.time)

我确定我以前做过这个并且很好,我错过了什么吗? (lastRecord.time 是一个 Int)。

我在这里检查了关于插值Swift String Interpolation displaying optional? 的答案,并尝试更改为这样的内容:

    if let previousRounds = String(lastRecord?.rounds) {
        previousRoundsLabel.text = previousRounds
    }

但得到同样的错误 + Initializer for conditional binding must have Optional type, not 'String'

【问题讨论】:

  • 谢谢你会检查出来 - 我不明白我的代码中的其他地方有 cell.repsNumber.text = String(exerciseName.reps) 工作正常!
  • 这个问题与 Realm 或变量是 Int 无关。这是因为lastRecordOptional,因此由于可选链接,lastRecord?.time 也是Optional
  • 好的谢谢 - 但我不明白为什么这意味着我不能转换为字符串(抱歉 - 我还是很新,我可能在这里遗漏了一些明显的东西) - 我已经还尝试使用 !但这不起作用
  • 出于某种原因,我已将您的问题标记为重复。他们的答案显示了解决您的问题的几种方法。您必须使用默认值、可选绑定或强制解包来解包 Optional,如链接问题的答案中所述。您根本没有投射,投射是使用 as 关键字完成的。您通过调用其指定的初始化程序将值转换String。转换成功,没有错误。

标签: swift string optional


【解决方案1】:

总结一下 Dávid Pásztor 的回答,您可以通过以下一种方法来解决它:

previousTimeLabel.text = String(lastRecord?.time ?? 0)

这可能不是您的应用程序的最佳方式。 Dávid 的观点是,在尝试将其时间 Int 传递给 String 初始化程序之前,您需要处理可能为 nil 的 lastRecord 。所以上面是一种简单的方法,如果没有lastRecord,你可以将“0”字符串作为previousTimeLabel的文本。

【讨论】:

  • 这对我有用,谢谢,但我最终使用了大卫的例子,所以我也可以混合一些插值 - 非常感谢 - 这个解释真的很有帮助
【解决方案2】:

问题不在于String(lastRecord?.time)Optional。问题是lastRecordOptional,所以你必须解开lastRecord,而不是String(lastRecord?.time) 的返回值。

if let lastRecord = lastRecord {
    previousRoundsLabel.text = "\(lastRecord.time)"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2014-08-04
    • 1970-01-01
    相关资源
    最近更新 更多