【问题标题】:How to extract value in "optional(value)"如何在“可选(值)”中提取值
【发布时间】:2015-05-28 11:20:31
【问题描述】:

我正在尝试检索 Optional(N) 中的值,其中“N”是值。我是 Swift 新手,所以我不确定我的语法是否正确,或者是否甚至建议这样编写我的代码,但这就是我所拥有的:

func dmg_Calc() {
if player.SPD < opponent.SPD   {
    var XX = rndm(2, 3)
    var A = opponent.Lvl
    var B = opponent.ATT
    var C = opponent.MOV[XX]?[1]
    var D = player.ATT
    var X = 1.0
    var Y = 1.0
    var Z = rndm_DBL(217.0, 255.0)


    // Opponent Attacks

    var DMG = ((2.0*A/5.0+2.0)*B)
        DMG = (DMG/D/50.0)+2.0
        DMG = DMG*(X*Y/10.0)*Z/255.0

    player.HP = (player.HP - DMG)

    println(C)
    println(DMG)
    println("HP Left \(player.HP)")
    println(XX)
}
}

如我所见,我将其用作伤害计算。我的问题是当你到达 Var C 时。那条线给了我一个 Optional(N)。它基本上是将字典路由到具有所需值的数组。

class Eevee {
var Lvl = 5.0
var HP = 20.0
var ATT = 55.0
var DEF = 15.0
var SPD = 16.0
var SPC = 15.0
var isPoisoned = false
var isParalyzed = false
var isAsleep = false
var MOV = [1 : ["Tackle", 40.0, 35], 2 : ["Tail Whip", 0.9, 35]]

上面是函数正在访问的类。我知道它可能看起来很乱或很糟糕,但我目前正在使用它。

我想要做的事情是否可行,或者我应该尝试不同的方法?任何帮助将不胜感激!!!

编辑:

现在我在 Xcode 中收到以下错误:

'NSObject' 不能转换为 'UInt8'

这是新的方程式:

var DMG = ((2.0*A/5.0+2.0)*B*C)
        DMG = (DMG/D/50.0)+2.0
        DMG = DMG*(X*Y/10.0)*Z/255.0

【问题讨论】:

  • 下次请删除所有不必要的代码以提高可读性。
  • 请说出这3行中的哪一行............
  • 第一个。带C的那个
  • 当使用可选计算时,您需要通过执行我在回答中所说的相同操作来告诉它它不是 nil。因为 C 是可选的,所以它不能确定 C 是否为 nil,所以它不会抓住这个机会给你一个错误。但是,Swift 中的错误仍然很容易误导。

标签: swift command-line


【解决方案1】:

当打印出一个可选项并且你知道它不是 nil 时,你会想要放一个 !在您要打印的内容之后

println(C!)

它只在打印它或将它插入像“(可选字符串)”这样的字符串时说 Optional(value),所以你不必“提取”它。

一个可选变量基本上是告诉程序这个变量在使用时可以为nil。

Please read Swift basics

【讨论】:

  • 很高兴知道!但我想把 C 放在那个大方程中,所以一个值为 40,方程不会改变。该值是否仍然适用,还是会乘以 optional(40)?
  • 好的,这完全可行,但我遇到了一个新问题。我现在正在编辑帖子。
【解决方案2】:

你得到一个可选的原因是因为字典可能不包含你搜索的键,在这种情况下一个 nil 可选意味着“不在字典中”。如果您确信 XX 将始终在 MOV 中,则使用对手.MOV[XX]![1]。

注意:更改 ?到 ! (如果 XX 不在 MOV 中,那么您将在运行时遇到致命错误!)。使用 !(发音为 bang)是为了警告您 - 您真的确定吗?

注意 2:如果数组在索引 1 处没有项目,那么在运行时也会出现致命错误。

【讨论】:

  • 是的,我确信 XX 将永远在 MOV 中。 MOV将保持4个具有攻击力的动作和可以使用的次数。你的方法也有帮助,但我在上面编辑了一个新错误。
  • 你有一个 Any 数组,你可能想要定义类似 struct Action{ name: String; value1:浮点数;值2:浮点数}。那么 MOV 是 [1 : Action("Tackle", 40.0, 35), 2 : Action("Tail Whip", 0.9, 35)]
  • 我仍然将 MOV 声明为 Var 吗?
  • 这取决于你是否要修改 MOV。
  • 是的,我想修改 Mov
猜你喜欢
  • 2022-11-12
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多