具有嵌套if循环的swift函数中存在未解决的标识符错误
我目前正在自学Swift,这是我最近学习Python和VisualBasic的背景。我会说自己在这些代码方面很有能力,但在Swift方面是个新手。我正在尝试编写一个函数,它将从长整数的开始或结束返回一组数字。我选择的方法是将整数转换为字符串,然后使用前缀或后缀命令 虽然如果函数没有流控制并且使用前缀或后缀(第一批代码),我可以让它工作,但当我尝试编写一个同时执行这两个操作的函数时,我在turnStringToInteger变量(第二批代码)上得到一个未解决的标识符错误。我很确定这是因为变量存在于if{}中,但是如果我在if循环之外声明它(散列),这也会出错。我很感激这将有一个非常简单的答案,但是如何正确地使用嵌套if循环的返回呢 这很有效具有嵌套if循环的swift函数中存在未解决的标识符错误,swift,string,function,integer,identifier,Swift,String,Function,Integer,Identifier,我目前正在自学Swift,这是我最近学习Python和VisualBasic的背景。我会说自己在这些代码方面很有能力,但在Swift方面是个新手。我正在尝试编写一个函数,它将从长整数的开始或结束返回一组数字。我选择的方法是将整数转换为字符串,然后使用前缀或后缀命令 虽然如果函数没有流控制并且使用前缀或后缀(第一批代码),我可以让它工作,但当我尝试编写一个同时执行这两个操作的函数时,我在turnStringToInteger变量(第二批代码)上得到一个未解决的标识符错误。我很确定这是因为变量存在于
//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
之后访问它,但是您必须确保在所有路径上都设置了它,或者为它提供一个初始值。我只是告诉你一个干净的方法,确保它得到一个值,而不必给出一些无用的初始值。