协慌网

登录 贡献 社区

获取 String 的长度

你如何得到一个String的长度?例如,我有一个变量定义如下:

var test1: String = "Scott"

但是,我似乎无法在字符串上找到长度方法。

答案

截至 Swift 4

只是:

test1.count

原因。

(感谢 Martin R)

截至 Swift 2:

使用 Swift 2,Apple 已将全局功能更改为协议扩展,扩展符合符合协议的任何类型。因此新的语法是:

test1.characters.count

(感谢 JohnDifool 的提醒)

截至 Swift 1

使用计数字符方法:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

就在 Apple Swift 指南中

(注意,对于早于 1.2 的 Swift 版本,这将是countElements(unusualMenagerie)

对于你的变量,它会

length = count(test1) // was countElements in earlier versions of Swift

或者您可以使用 test1.utf16count

TLDR:

对于Swift 2.0 和 3.0,请使用test1.characters.count 。但是,你应该知道一些事情。所以,请继续阅读。

在 Swift 中计算字符数

在 Swift 2.0 之前, count是一个全局函数。从 Swift 2.0 开始,它可以被称为成员函数。

test1.characters.count

它将返回String实际的 Unicode 字符数,因此它是最正确的替代方法,如果你打印字符串并手动计算字符,你会得到相同的结果。

但是,由于Strings在 Swift 中的实现方式,字符并不总是占用相同数量的内存,因此请注意,这种行为与其他语言中通常的字符数方法完全不同。

例如,您也可以使用test1.utf16.count

但是,如下所述,返回的值不能保证与调用characters count相同。

从语言参考:

扩展的字形集群可以由一个或多个 Unicode 标量组成。这意味着不同的字符和相同字符的不同表示可能需要不同的内存量来存储。因此,Swift 中的字符不会在字符串表示中占用相同数量的内存。因此,如果不迭代字符串以确定其扩展的字形集群边界,则无法计算字符串中的字符数。如果使用特别长的字符串值,请注意 characters 属性必须遍历整个字符串中的 Unicode 标量,以确定该字符串的字符。

characters 属性返回的字符数不总是与包含相同字符的 NSString 的 length 属性相同。 NSString 的长度基于字符串的 UTF-16 表示中的 16 位代码单元的数量,而不是字符串中 Unicode 扩展的字形集群的数量。

完美地说明上述情况的一个例子是检查包含单个表情符号字符的字符串的长度,如注释中的n00neimp0rtant所指出的。

var emoji = "?"
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2

Swift 1.2 更新:不再有 countElements 来计算集合的大小。只需使用 count 函数作为替换:count(“Swift”)

Swift 2.0,3.0 和 3.1:

让 strLength = string.characters.count

Swift 4.2(4.0 起): [Apple 文档 - 字符串]

让 strLength = string.count