迅速;从未使用过不变值的初始化

时间:2018-08-06 18:11:52

标签: swift swift-playground

我有一段简单的Swift代码:

let message = "This is a test"

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

print(message)

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

我收到以下警告:

  

从未使用过对不可变值“消息”的初始化;考虑   替换为分配给“ _”或将其删除

let message = "Changed string"

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

我在做什么错了?

4 个答案:

答案 0 :(得分:4)

您为什么要再次声明?如果要更改它,则应将其设为变量并使用相同的变量。

var message = "This is a test"

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

print(message)

答案 1 :(得分:3)

因此,一些人已经给了您合理的,技术上正确的答案,但是我想解释一下:

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

var message = "This is a test"

  • 更适合此条件的API可能是contains,因为它不支持区域设置并返回Bool,而不必通过以下方式将NSRange转换为Bool针对!= nil
  • 进行测试

鉴于上述情况,最终代码如下:

var message = "This is a test"

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

print(message)

希望有帮助!

答案 2 :(得分:2)

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"

答案 3 :(得分:2)

在您的代码中有两个称为message的变量。一种是带有“已更改的字符串”的内部变量。另一个外部值为“ 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回答。