Swift String常量是否与String文字不同?

时间:2015-12-03 20:46:18

标签: string swift types constants literals

在Swift 2.1中,下面的代码段会产生错误。

var str = "Hello, playground!"

// Success Case
if "!" == str.characters.last {
    print("Tone it down please")
}

// Fail Case
let bang = "!"

if bang == str.characters.last {  // this line won't compile
    print("Tone it down please")
}

编译错误说:

  

二进制运算符'=='不能应用于'String'类型的操作数   和'_Element?'

那么在这种情况下,建议使用常量而不是 literal 的方法是什么? (我正在学习Swift,所以请随意提一下是否有一种Swift-er方式来处理这种比较检查。)

谢谢!

4 个答案:

答案 0 :(得分:4)

对于您的&#34;失败案例&#34;,这是因为str.characters.last是可选的并且是Character,但bangString。< / p>

您可以安全地展开并与if let ... where进行比较,并使用String()Character更改为String进行比较:

if let last = str.characters.last where String(last) == bang {
    print("Tone it down please")
}

答案 1 :(得分:2)

如错误所示,第一个运算符为String,第二个运算符为可选Character

但是您已经证明您知道如何将字符串转换为Character?,所以让我们使用它:

if bang.characters.last == str.characters.last {
    print("Tone it down please")
}

您知道bang.characters.last只会返回"!",但现在它将与str.characters.last属于同一类型,因此比较它们是微不足道的。

答案 2 :(得分:1)

感谢您的好评。这是我自己的答案,通过消除无关的选项来改进插图,并在演示中演示类型推断的 好的和

let a:String = "!"              // type is String
let b:Character = "!"           // type is Character
let c = "!".characters.last!    // type is _Element
let bang = "!"                  // inferred type is String

if "!" == a { print("literal matches string") }
if "!" == b { print("literal matches Character") }
if "!" == c { print("literal matches _Element") }

if a == b { print("a matches b") }      // Err: 'String' to 'Character'
if a == c { print("a matches c") }      // Err: 'String' to '_Element' 
if b == c { print("b matches c") }      // OK: 'Character' to '_Element' 

结论:如果上下文提示,则由单个引号字符组成的文字可以被识别为StringCharacter(或等效地为_Element)。

重要的是:常量的类型在声明时永久建立。文本的类型是从其上下文推断出来的,因此相同的文字在不同的上下文中可能有不同的类型。

对于文字提供的灵活类型推断不具有常量。

答案 3 :(得分:-1)

不确定这是否完全相关,但我发现这篇文章是因为我在characters.firstcharacters.lastInt之间转换时出现问题。

如果这有助于任何人:

let element = characters.first! // the ! is important
let myString = String(element) 
let myInt = Int(myString) // may be nil if character is not an int