带有嵌套 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
}
我目前正在自学 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
}