命名函数中的常量是否与传递参数的不良做法相同?

  • 本文关键字:不良 参数 函数 常量 是否 swift
  • 更新时间 :
  • 英文 :


我正在学习快速编程语言。我正在关注 Apple 的"使用 Swift 进行应用程序开发简介"。在课程中,我被指示将问题论点小写。

// The course's answer
func responseTo(question: String) -> String {
let lowerQuestion = question.lowercased()
if lowerQuestion.hasPrefix("where") {
return "To the North!"
} else if lowerQuestion == "where are the cookies?" {
return "In the cookie jar!"
} else {
return "That really depends"
}
}
// My answer
func responseTo(question: String) -> String {
// TODO: Write a response
let question = question.lowercased()
if question.hasPrefix("hello") {
return "Why, hello there"
} else {
return "That really depends"
}
}

正在传递字符串问题。我的做法是做一个常数也命名的问题。该课程做了一个常数,称为低问题。

我的方式被认为是不好的做法吗?这会导致大规模应用程序中的错误吗?

感谢您抽出宝贵时间看我的问题!

新的question常量有效地隐藏了question参数,这意味着在声明question常量后,您将无法再访问参数question

在这种情况下,您不再需要该参数,因此这样做很好,但是在更大规模的项目中,您永远不知道您的需求何时会发生变化,以及何时在方法的后面question实际上需要参数。发生这种情况时,更改它对您来说更麻烦。

此外,拥有两个同名变量通常不是一个好主意。代码的读者很容易在它们之间混淆,即使编译器没有。

这是一件完全有效的事情!如果变量位于不同的作用域中,还可以声明具有相同名称的变量。

通常这是可以的。但是,如果您有一个同名的全局变量,那么它可能会导致突变。无论如何,最佳做法可能是对变量名称进行更具描述性。

此外,一旦您将 question = question.toLowerCase(( 分配,您将无法再访问参数的原始值。

只要您计划使用本地定义的名称并且不打算引用收到的参数,这不是一个坏做法。 在安全解包 Optional 参数时,它特别有用。

例如:

func responseTo(question: String?) -> String {
// Exit early if our parameter is nil
guard let question = question else {
return "What question?"
}
...
}

另一个示例可以是使用 URL(或任何可失败的初始值设定项(,或者当方便使用转换为其他类型的参数时:

func process(url: String) {
guard let url = URL(string: url) else {
return // bailing early 
}
...
}
func addThree(to number: String) throws {
guard let number = Int(number) else {
throw Error.notANumber
}
return number + 3
}

或者当你的参数是某个枚举的原始值时:

enum Pet: String {
case dog
case cat
case bird
}
var pets = [Pet]()
func add(newPet: String) {
guard let newPet = Pet(rawValue: newPet) else {
return
}
pets.append(newPet)
}

最新更新