你怎么得到一个长度String
?例如,我有一个变量定义如下:
var test1: String = "Scott"
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法在字符串上找到长度方法.
mgi*_*inn 1248
截至Swift 4
只是:
test1.count
Run Code Online (Sandbox Code Playgroud)
原因.
(感谢Martin R)
截至Swift 2:
使用Swift 2,Apple已将全局功能更改为协议扩展,扩展符合符合协议的任何类型.因此新的语法是:
test1.count
Run Code Online (Sandbox Code Playgroud)
(感谢JohnDifool的提醒)
截至Swift 1
使用计数字符方法:
test1.characters.count
Run Code Online (Sandbox Code Playgroud)
就在Apple Swift指南中
(注意,对于早于1.2的Swift版本,这将是.count
相反的)
对于你的变量,它会
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
Run Code Online (Sandbox Code Playgroud)
或者您可以使用test1.utf16count
Cez*_*zar 334
对于Swift 2.0和3.0,请使用test1.characters.count
.但是,你应该知道一些事情.所以,请继续阅读.
在Swift 2.0之前,它count
是一个全局函数.从Swift 2.0开始,它可以被称为成员函数.
test1.characters.count
Run Code Online (Sandbox Code Playgroud)
它将返回a中的实际Unicode字符数String
,因此它是最正确的替代方法,如果你打印字符串并手动计算字符,你会得到相同的结果.
但是,由于Strings
在Swift中实现了这种方式,字符并不总是占用相同数量的内存,因此请注意,这与其他语言中的常用字符数方法完全不同.
例如,您也可以使用 test1.utf16.count
但是,如下文所述,返回值不保证是相同的调用count
上characters
.
从语言参考:
扩展的字形集群可以由一个或多个Unicode标量组成.这意味着不同的字符和相同字符的不同表示可能需要不同的内存量来存储.因此,Swift中的字符不会在字符串表示中占用相同数量的内存.因此,如果不迭代字符串以确定其扩展的字形集群边界,则无法计算字符串中的字符数.如果您正在使用特别长的字符串值的工作,要知道,在人物属性必须遍历整个字符串中的Unicode标量,以确定该字符串中的字符.
characters属性返回的字符数不总是与包含相同字符的NSString的length属性相同.NSString的长度基于字符串的UTF-16表示中的16位代码单元的数量,而不是字符串中Unicode扩展的字形集群的数量.
完美地说明上述情况的一个例子是检查包含单个表情符号字符的字符串的长度,如注释中的n00neimp0rtant所指出的.
var emoji = ""
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
Run Code Online (Sandbox Code Playgroud)
San*_*San 91
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
whi*_*and 59
extension String {
var length: Int { return countElements(self) } //
}
Run Code Online (Sandbox Code Playgroud)
Vya*_*lav 47
斯威夫特4
"string".count
;)
斯威夫特3
extension String {
var length: Int {
return self.characters.count
}
}
Run Code Online (Sandbox Code Playgroud)
用法
"string".length
Ken*_*ner 24
如果你只是想看一个字符串是否为空(检查长度为0),Swift提供了一个简单的布尔测试方法 String
myString.isEmpty
Run Code Online (Sandbox Code Playgroud)
这个硬币的另一面是人们在ObjectiveC中问如何询问字符串是否为空,答案是检查长度为0:
Sco*_*ner 18
tl; dr如果您想根据人类可读字符的数量获取String类型的长度,请使用countElements().如果您想知道扩展字形集群数量的长度,请使用endIndex.继续阅读以了解详情.
的字符串型被实现为Unicode字符的有序集合(即,序列),它符合CollectionType协议,它符合_CollectionType协议,它是由所期望的输入类型()countElements.因此,可以调用countElements(),传递String类型,它将返回字符数.
但是,符合CollectionType,而CollectionType又符合_CollectionType,String还实现了startIndex和endIndex计算属性,它们实际上分别表示第一个字符簇之前的索引位置,以及最后一个字符簇之后的索引位置..因此,在字符串"ABC"中,A之前的索引的位置是0,而C之后的位置是3.因此,endIndex = 3,这也是字符串的长度.
所以,endIndex可以用来获取任何String类型的长度,对吧?
好吧,并非总是...... Unicode字符实际上是扩展的字形集群,它是一个或多个 Unicode标量的序列,组合起来创建一个人类可读的字符.
let circledStar: Character = "\u{2606}\u{20DD}" // ??
Run Code Online (Sandbox Code Playgroud)
circledStar是由U + 2606(白色星星)和U + 20DD(组合围圈)组成的单个角色.让我们从circledStar创建一个String,并比较countElements()和endIndex的结果.
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
Run Code Online (Sandbox Code Playgroud)
Ant*_*ine 15
在Swift 2.0 count
中不再起作用了.您可以使用此代替:
var testString = "Scott"
var length = testString.characters.count
Run Code Online (Sandbox Code Playgroud)
Jea*_*nan 14
这是比使用全局函数更短,更自然的东西:
aString.utf16count
Run Code Online (Sandbox Code Playgroud)
不过,我不知道它是否可用于测试版1.但它绝对存在于测试版2中.
小智 11
更新了Xcode 6 beta 4,更改方法utf16count - > utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Run Code Online (Sandbox Code Playgroud)
要么
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
Run Code Online (Sandbox Code Playgroud)
Jer*_*Fox 10
截至Swift 1.2 utf16Count
已被删除.您现在应该使用全局count()
函数并传递字符串的UTF16视图.以下示例......
let string = "Some string"
count(string.utf16)
Run Code Online (Sandbox Code Playgroud)
Sar*_*ith 10
let flag = ""
print(flag.count)
// Prints "1" -- Counts the characters and emoji as length 1
print(flag.unicodeScalars.count)
// Prints "2" -- Counts the unicode lenght ex. "A" is 65
print(flag.utf16.count)
// Prints "4"
print(flag.utf8.count)
// Prints "8"
Run Code Online (Sandbox Code Playgroud)
你可以这样试试
var test1: String = "Scott"
var length = test1.bridgeToObjectiveC().length
Run Code Online (Sandbox Code Playgroud)
对于XCode 7.3和Swift 2.2.
let str = ""
Run Code Online (Sandbox Code Playgroud)
1)如果你想要视觉角色的数量:
str.characters.count // 1
Run Code Online (Sandbox Code Playgroud)
2)如果你想要16-bit code units within the string’s UTF-16 representation
:
str.utf16.count // 2
Run Code Online (Sandbox Code Playgroud)
大多数时候,1)是你需要的.
你什么时候需要2)?我找到了一个用例2):
let regex = try! NSRegularExpression(pattern:"",
options: NSRegularExpressionOptions.UseUnixLineSeparators)
let str = ""
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.utf16.count), withTemplate: "dog")
print(result) // dogdogdogdogdogdog
Run Code Online (Sandbox Code Playgroud)
如果使用1),结果不正确:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog
Run Code Online (Sandbox Code Playgroud)
在Swift 2.x中,以下是如何查找字符串的长度
let findLength = "This is a string of text"
findLength.characters.count
Run Code Online (Sandbox Code Playgroud)
返回24
在 swift4 中我一直使用string.count
直到今天我发现
string.endIndex.encodedOffset
Run Code Online (Sandbox Code Playgroud)
是更好的替换,因为它更快 - 对于 50 000 个字符的字符串,大约比.count
. 这.count
取决于字符串长度,但.endIndex.encodedOffset
并非如此。
但有一个NO。对于带有表情符号的字符串不好,它会给出错误的结果,所以只有.count
正确的结果。
小智 5
Swift 2.0:算一算: yourString.text.characters.count
有趣的例子是在UITextView中显示某个数字(例如150)的字符倒计时:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Run Code Online (Sandbox Code Playgroud)
在Swift 4中:\n如果字符串不包含 unicode 字符,则使用以下内容
\n\nlet str : String = "abcd"\nlet count = str.count // output 4\n
Run Code Online (Sandbox Code Playgroud)\n\n如果字符串包含 unicode 字符,则使用以下命令:
\n\nlet spain = "Espa\xc3\xb1a"\nlet count1 = spain.count // output 6\nlet count2 = spain.utf8.count // output 7\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
454928 次 |
最近记录: |