Swift;从未使用过不可变值的初始化

Swift; Initialization of immutable value was never used

我有一段简单的 Swift 代码:

let message = "This is a test"

if message.range(of:"test") != nil {
    let message = "Changed string"
}

print(message)

我想做的:如果字符串message包含字符串test,将其更改为Changed string。否则保持不变。

我收到以下警告:

Initialization of immutable value 'message' was never used; consider replacing with assignment to '_' or removing it

let message = "Changed string"

此外,打印输出仍然是 This is a test 而不是预期的 Changed string

我做错了什么?

如果你想让它改变它,你应该把它变成一个变量并使用相同的变量。

var message = "This is a test"

if message.range(of:"test") != nil {
    message = "Changed string"
}

print(message)

Swift 4 实施

这是我能解决这个问题的最简单的方法。

var message1 = "This is a test"
var message2 = "This is a"

print(message1.contains("test") ? "Changed String" : message1) //"Changed String"
print(message2.contains("test") ? "Changed String" : message2) //"This is a"

您的代码中有两个名为 message 的变量。一种是带有"Changed string"的内部变量。另一个外部的值 "This is a test"。所以,如果你想改变变量只需用 var.

声明它

如果您的代码是这样的:

let message = "This is a test"

if message.range(of:"test") != nil {
    let message = "Changed string"
    print (message)
}

print(message)

你会得到这个输出:

"Changed string" "This is a test"

这是因为内部变量没有改变外部变量。 在内部,您只需声明而不使用它。警告只是告诉你有一个未使用的变量。

而不是这个双 let,你可以声明:

var message = "This is a test"

if message.range(of:"test") != nil {
    message = "Changed string"
}

print(message)

如 Rakesha Shastri 所回答。

所以,一些人已经给了你合理的、技术上正确的答案,但我想解释一下:

  • 将值声明为 let 意味着它是一个常量,即不可变的
  • 您收到警告是因为您没有按预期修改值,而是在 if 语句的范围内重新声明它。为了声明一个可变变量,我们使用 var 即:

var message = "This is a test"

  • 更适合此条件的 API 可能是 contains,因为它是语言环境未知的并且 returns Bool,而不是必须转换 NSRangeBool 通过测试 != nil

综上所述,最终代码如下:

var message = "This is a test"

if message.contains("test") {
    message = "Changed string"
}

print(message)

希望对您有所帮助!