你怎么得到一个长度String
?例如,我有一个定义如下的变量:
var test1: String = "Scott"
但是,我似乎找不到在字符串上的长度方法。
你怎么得到一个长度String
?例如,我有一个定义如下的变量:
var test1: String = "Scott"
但是,我似乎找不到在字符串上的长度方法。
Answers:
自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
string.count
。
对于Swift 2.0和3.0,请使用test1.characters.count
。但是,您应该了解一些事情。因此,继续阅读。
在Swift 2.0之前,它count
是一个全局函数。从Swift 2.0开始,它可以被称为成员函数。
test1.characters.count
它会返回中的Unicode字符的实际数量String
,因此,这是最正确的选择,如果您要打印字符串并手动计算字符,则将得到相同的结果。
但是,由于Strings
是在Swift中实现的方式,字符并不总是占用相同的内存量,因此请注意,其行为与其他语言中的常规字符计数方法完全不同。
例如,您也可以使用 test1.utf16.count
但是,如下所述,不能保证返回的值与调用count
on 相同characters
。
从语言参考:
扩展字素簇可以由一个或多个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
countElements()
)获取字符串中确切的字符数。这可能与您[str length]
在Objective-C中调用所得到的有所不同,因为该length
方法假定字符串中的所有字符均由16位代码单元组成,而countElements()
获得的是Unicode字符的实际数量。但是,在大多数情况下,上述所有替代方法都会返回相同的结果,尤其是在使用英语通用字符的情况下。
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
斯威夫特1.1
extension String {
var length: Int { return countElements(self) } //
}
斯威夫特1.2
extension String {
var length: Int { return count(self) } //
}
雨燕2.0
extension String {
var length: Int { return characters.count } //
}
斯威夫特4.2
extension String {
var length: Int { return self.count }
}
let str = "Hello"
let count = str.length // returns 5 (Int)
斯威夫特4
"string".count
;)
迅捷3
extension String {
var length: Int {
return self.characters.count
}
}
用法
"string".length
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" print(type(of: str.characters.count)) print(type(of: str.count))
如果您只是想查看字符串是否为空(检查长度是否为0),Swift会提供一个简单的布尔测试方法 String
myString.isEmpty
硬币的另一面是人们在ObjectiveC中问如何在检查长度为0的地方问字符串是否为空:
tl; dr如果要以人类可读字符的数量表示String类型的长度,请使用countElements()。如果要根据扩展字素簇的数量知道长度,请使用endIndex。继续阅读以获取详细信息。
的字符串型被实现为一个有序集合中的Unicode字符(即,序列),它符合CollectionType协议,这符合_CollectionType协议,它是由所期望的输入类型()countElements。因此,可通过传递String类型来调用countElements(),它将返回字符数。
但是,在遵循CollectionType(又符合_CollectionType)的情况下,String还实现了startIndex和endIndex计算的属性,它们实际上分别表示第一个字符簇之前的索引位置和最后一个字符簇之后的索引位置。。因此,在字符串“ ABC”中,索引在A之前和C之后的位置是3。因此,endIndex = 3,这也是字符串的长度。
因此,可以使用endIndex来获取任何String类型的长度,对吧?
好吧,并非总是... Unicode字符实际上是扩展的字素簇,它们是一个或多个 Unicode标量的序列,它们组合在一起以创建一个人类可读的字符。
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
circledStar是由U + 2606(白星)和U + 20DD(一个组合的圆圈)组成的单个字符。让我们从circledStar创建一个String并比较countElements()和endIndex的结果。
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
已针对Xcode 6 beta 4更新,更改方法utf16count-> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
要么
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
将是错误的
从Swift 1.2开始utf16Count
已被删除。现在,您应该使用全局count()
函数并传递字符串的UTF16视图。下面的例子
let string = "Some string"
count(string.utf16)
对于Xcode 7.3和Swift 2.2。
let str = "🐶"
如果需要可视字符数:
str.characters.count
如果要“字符串的UTF-16表示形式内的16位代码单元”:
str.utf16.count
大多数情况下,您需要的是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
如果使用1,则结果不正确:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶
在Swift 4中:如果字符串不包含Unicode字符,则使用以下命令
let str : String = "abcd"
let count = str.count // output 4
如果字符串包含Unicode字符,则使用以下命令:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
utf8.count
?那不算字符数。它给出了字符串的UTF-8编码所需的字节数。
从您的textview或textfield中获取字符串值:
let textlengthstring = (yourtextview?.text)! as String
查找字符串中的字符数:
let numberOfChars = textlength.characters.count
这就是我最终要做的
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
return true
情况吗?)。您能否仔细检查一下,以防您修改答案?谢谢!
Swift 4更新与Swift 3比较
Swift 4消除了在String上使用字符数组的需要。这意味着您可以直接调用count
字符串,而无需先获取字符数组。
"hello".count // 5
而在swift 3中,您将必须获取character数组,然后计算该数组中的element。请注意,以下方法在swift 4.0中仍然可用,因为您仍然可以调用characters
以访问给定字符串的字符数组
"hello".characters.count // 5
Swift 4.0还采用Unicode 9,它现在可以解释字素簇。例如,指望表情符号会得到1,而在迅速3.0中,您可能会得到大于1的计数。
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4
您可以通过编写扩展名来简单地获取长度:
extension String {
// MARK: Use if it's Swift 2
func stringLength(str: String) -> Int {
return str.characters.count
}
// MARK: Use if it's Swift 3
func stringLength(_ str: String) -> Int {
return str.characters.count
}
// MARK: Use if it's Swift 4
func stringLength(_ str: String) -> Int {
return str.count
}
}
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
这将计算常规Swift字符串中的字符
countElements((newString as String))
这计算了NSString中的字符
test1.characters.count
将为您获取字符串中字母/数字等的数量。
例如:
test1 = "StackOverflow"
print(test1.characters.count)
(打印 “ 13 ”)