带有嵌套 if 循环的 swift 函数中未解决的标识符错误

Unresolved identifier error in swift function with nested if loop

我目前正在自学 Swift 最近有 Python 的背景,最初是 Visual Basic。我会形容自己精通这些代码,但在 Swift 方面是个新手。我正在尝试编写一个函数,它将 return 从长整数的开头或结尾开始的一组数字。我选择的方法是将整数转换为字符串,然后使用前缀或后缀命令。

虽然如果函数没有流控制并使用前缀或后缀(第一批代码),我可以使该函数工作,但当我尝试编写一个同时执行这两种操作的函数时,我在turnStringToInteger 变量(第二批代码)。我很确定这是因为变量位于 if {} 中,但如果我在 if 循环之外声明它(散列),这也会出错。我很欣赏这将有一个非常简单的答案,但是如何在嵌套的 if 循环中正确使用 return ?

这有效...

//Function to Trim Integer (Prefix Only)
func integerTrim(integer:Int, trimLength:Int) -> Int {
    var strFromInteger = String(integer)
    var trimmedString = strFromInteger.prefix(trimLength)
    var intFromString = Int(trimmedString) ?? 0
    return intFromString
}

//Declare Input
var inputInt = 12345678910

//Call Function
var result = integerTrim(integer: inputInt, trimLength: 4)

//Print Results
print(inputInt)
print(result)

这不...!

//Function to trim integer prefix or suffix
func integerTrim(integer:Int, type:String, trimLength:Int) -> Int {
    var typeID = type
    //var turnStringToInteger: Int
    if typeID == "P" {
        var turnIntegerToString = String(integer)
        var trimmedString = turnIntegerToString.prefix(trimLength)
        var turnStringToIngeger = Int(trimmedString) ?? 0
    }
    else if typeID == "S" {
        var turnIntegerToString = String(integer)
        var trimmedString = turnIntegerToString.suffix(trimLength)
        var turnStringToIngeger = Int(trimmedString) ?? 0
    }
    return turnStringToInteger
}

//Declare Input
var inputInt = 53737363856453

//Call Function
var result = integerTrim(integer: inputInt, type: "P", trimLength: 4)

//Print Results
print(inputInt)
print(result)

因为我是自学的,所以我很感激我也可能没有使用最佳实践。我真的很想学会正确地做到这一点,所以如果我以错误的方式开始所有这一切,我同样很乐意听到其他方法。例如,我确实考虑过将整数转换为数组,然后从该数组中的位置创建修剪后的整数。这样会不会更优雅?

有几种方法可以做到这一点。问题的根源是您的 turnIntegerToString 生命周期在大括号内 - 而 return 在大括号之外。

func integerTrim(integer:Int, type:String, trimLength:Int) -> Int {
    var typeID = type
    var turnStringToInteger: Int = 0
    // If you don't want to assign it to zero (your nil coalesce implies we can) - instead use...
    // var turnStringToInteger: Int! // However - this can crash since your if statement does not cover all situations

    if typeID == "P" {
        var turnIntegerToString = String(integer)
        var trimmedString = turnIntegerToString.prefix(trimLength)
        turnStringToIngeger = Int(trimmedString) ?? 0
    }
    else if typeID == "S" {
        var turnIntegerToString = String(integer)
        var trimmedString = turnIntegerToString.suffix(trimLength)
        turnStringToIngeger = Int(trimmedString) ?? 0
    }
    return turnStringToInteger
}

如果要访问赋值范围外的变量,需要在外层范围声明。

如果您在没有为其分配初始值的情况下执行此操作,则会出现错误:变量 'turnStringToInteger' 在初始化之前已使用 。发生这种情况是因为 Swift 看到一条路径,其中 turnStringToInteger 永远不会被分配一个值(想象一下如果 "X" 被传递给 type 会发生什么)。

所以您真正的问题是使用 String 作为 type 的类型。最好使用 enum 来准确表达您想要的内容:

enum TrimType {
    case prefix, suffix
}

func integerTrim(integer: Int, type: TrimType, trimLength: Int) -> Int {

    let typeID = type
    var turnStringToInteger: Int

    switch typeID {
    case .prefix:
        let turnIntegerToString = String(integer)
        let trimmedString = turnIntegerToString.prefix(trimLength)
        turnStringToInteger = Int(trimmedString) ?? 0
    case .suffix:
        let turnIntegerToString = String(integer)
        let trimmedString = turnIntegerToString.suffix(trimLength)
        turnStringToInteger = Int(trimmedString) ?? 0
    }

    return turnStringToInteger
}

现在 type 只有 2 种可能性,switch 处理两种可能性。

你这样称呼它:

let result = integerTrim(integer: inputInt, type: .prefix, trimLength: 4)

...稍微重构后:

func integerTrim(integer: Int, type: TrimType, trimLength: Int) -> Int {

    let turnIntegerToString = String(integer)
    let trimmedString: Substring

    switch type {
    case .prefix:
        trimmedString = turnIntegerToString.prefix(trimLength)
    case .suffix:
        trimmedString = turnIntegerToString.suffix(trimLength)
    }

    return Int(trimmedString) ?? 0

}