在Swift中的字符和字符串

4

阅读文档这个答案,我发现可以通过以下两种方式初始化Unicode字符:

let narrowNonBreakingSpace: Character = "\u{202f}"
let narrowNonBreakingSpace = "\u{202f}"

据我了解,第二种实际上是一个字符串。与Java不同的是,它们都使用双引号(而不是单引号表示字符)。我看过几个例子,即使变量只包含一个字符,也使用了第二种形式(没有使用Character)。这是因为人们懒惰或忘记写Character吗?还是Swift会处理所有细节,我不需要担心?如果我知道一个常量只包含一个Unicode值,我应该总是使用Character吗?

我不明白这个问题。字符串和字符是不同的类型。如果你需要一个字符串,那就创建一个字符串(可以包含0个、1个或多个字符)。如果你需要一个字符,那就创建一个字符。 - Martin R
那么,每次我需要一个字符时,我都应该明确地使用 Character 来指定它,而不是让编译器推断,对吗?这两种形式之间是否存在性能差异? - Suragch
2个回答

5

当没有指定类型时,Swift 会在创建变量或常量时从字符串字面量中创建 String 实例,无论其长度。由于在 Swift 和 Cocoa/Foundation 方法中,String 非常普遍,因此除非您需要 Character,否则应该只使用 String ——否则每次需要使用它时都需要转换为 String


我想我正在尝试理解如果我可以让它成为一个字符串,那么Character的“特定需求”是什么。我喜欢你的答案,因为它使编程更容易。但是当涉及大量Unicode文本处理(比较字符,字典查找等)时,我担心性能问题。 - Suragch
除非您编写的例程确实需要单独查看字符串中的字符,否则您可能永远不会遇到特定的需求。关于性能,我在使用Swift时的通用建议是使用默认设置,并将优化留给编译器,除非您已经证明存在实际问题。 - Nate Cook

-2

在第二种情况下,Swift编译器将推断字符串的类型实际上是字符。因此,添加: Character并不是真正必要的。在这种情况下,我会添加它,因为很容易错误地假设这个字符是一个字符串,另一个开发人员可能会尝试将其视为字符串。然而,编译器会抛出错误,因为它推断出这个字符串的类型不是字符串,而是字符。

因此,在我看来,添加Character并不是懒惰或遗忘的问题,而是信任编译器正确推断这个常量的类型,并依赖于编译器在我尝试错误使用这个常量时抛出正确的错误。

Swift的编译器基本上处理了所有细节,如果你添加Character,它并不重要,编译器会(应该)处理它。


2
这是错误的,或者至少是误导性的。第二行 let narrowNonBreakingSpace = "\u{202f}" 创建了一个字符串而不是字符。编译器在该语句中无法推断类型为字符。 - Martin R
2
谢谢,我一直以为这就是它的工作原理,因为两个语句都输出了一个不间断空格,我有点期望如果 let narrowNonBreakingSpace = "\u{202f}" 是一个字符串,它会输出字面字符串。今天我学到了 :) - donnywals

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接