Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有嵌套if循环的swift函数中存在未解决的标识符错误_Swift_String_Function_Integer_Identifier - Fatal编程技术网

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

具有嵌套if循环的swift函数中存在未解决的标识符错误,swift,string,function,integer,identifier,Swift,String,Function,Integer,Identifier,我目前正在自学Swift,这是我最近学习Python和VisualBasic的背景。我会说自己在这些代码方面很有能力,但在Swift方面是个新手。我正在尝试编写一个函数,它将从长整数的开始或结束返回一组数字。我选择的方法是将整数转换为字符串,然后使用前缀或后缀命令 虽然如果函数没有流控制并且使用前缀或后缀(第一批代码),我可以让它工作,但当我尝试编写一个同时执行这两个操作的函数时,我在turnStringToInteger变量(第二批代码)上得到一个未解决的标识符错误。我很确定这是因为变量存在于

我目前正在自学Swift,这是我最近学习Python和VisualBasic的背景。我会说自己在这些代码方面很有能力,但在Swift方面是个新手。我正在尝试编写一个函数,它将从长整数的开始或结束返回一组数字。我选择的方法是将整数转换为字符串,然后使用前缀或后缀命令

虽然如果函数没有流控制并且使用前缀或后缀(第一批代码),我可以让它工作,但当我尝试编写一个同时执行这两个操作的函数时,我在turnStringToInteger变量(第二批代码)上得到一个未解决的标识符错误。我很确定这是因为变量存在于if{}中,但是如果我在if循环之外声明它(散列),这也会出错。我很感激这将有一个非常简单的答案,但是如何正确地使用嵌套if循环的返回呢

这很有效

//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)

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

有几种方法可以做到这一点。问题的根源是您的
turnigertostring
生存期在大括号内,而返回值在大括号外

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”,会发生什么情况)

因此,真正的问题是使用
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
}
现在,
类型
只有两种可能性,
开关
处理这两种情况

你这样称呼它:

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

}

这是一个非常巧妙的解决方案。我以前从未遇到过这种转变,这是一种整洁的做事方式。我以为这是我声明变量的地方,但我对事情还不够熟悉,无法正确地分类我的问题。也许我需要花更多的时间学习教程,但我总是发现最好的学习方法就是卷起袖子!非常感谢,非常感谢。这是您声明变量的地方。因此,将它移动到
if
之前,您可以在
if
之后访问它,但是您必须确保在所有路径上都设置了它,或者为它提供一个初始值。我只是告诉你一个干净的方法,确保它得到一个值,而不必给出一些无用的初始值。