获取一个string的长度
你如何获得一个String
的长度? 例如,我有一个定义如下的variables:
var test1: String = "Scott"
但是,我似乎无法findstring上的长度方法。
截至斯威夫特4
随着即将到来的Swift 4,它将会是:
test1.count
原因。
(感谢Martin R)
从Swift 2开始:
随着Swift 2,苹果公司已经将全球function改变为协议扩展,符合协议的任何types的扩展。 因此,新的语法是:
test1.characters.count
(感谢JohnDifool的领导)
作为斯威夫特1
使用计数字符方法:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪" println("unusualMenagerie has \(count(unusualMenagerie)) characters") // prints "unusualMenagerie has 40 characters"
从苹果Swift指南
(注意,对于早于1.2的Swift版本,这将是countElements(unusualMenagerie)
)
为你的variables,这将是
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字符的实际数量,所以这是最正确的select,如果你打印string和手动计数字符,你会得到相同的结果。
不过,由于Strings
在Swift中的实现方式,字符并不总是占用相同数量的内存,因此请注意,这与其他语言中通常的字符计数方法有很大不同。
例如,你也可以使用test1.utf16.count
但是,如下所述,返回的值不能保证与调用characters
count
相同。
从语言参考:
扩展字形集群可以由一个或多个Unicode标量组成。 这意味着不同的字符以及相同字符的不同表示可能需要不同数量的内存来存储。 正因为如此,Swift中的字符在string的表示中并不占用相同数量的内存。 因此,如果不迭代string以确定其扩展的字形群集边界,则无法计算string中的字符数。 如果您使用特别长的string值,请注意字符属性必须遍历整个string中的Unicode标量以确定该string的字符。
由characters属性返回的字符数不总是与包含相同字符的NSString的length属性相同。 NSString的长度基于string的UTF-16表示中的16位代码单元的数量,而不是string中的Unicode扩展字形群集的数量。
上面描述的情况的一个例子是检查包含单个表情符号的string的长度,正如注释中的n00neimp0rtant所指出的那样。
var emoji = "👍" emoji.characters.count //returns 1 emoji.utf16.count //returns 2
Swift 1.2更新:不再有一个countElements来计算集合的大小。 只需使用count函数作为replace:count(“Swift”)
Swift 2.0,3.0和3.1:
让strLength = string.characters.count
Swift 4.0: [Apple文档 – string]
让strLength = string.count
let str = "Hello" let count = str.length // returns 5 (Int) extension String { var length: Int { return countElements(self) } // Swift 1.1 } extension String { var length: Int { return count(self) } // Swift 1.2 } extension String { var length: Int { return characters.count } // Swift 2.0 }
斯威夫特4
"string".count
;)
Swift 3
extension String { var length: Int { return self.characters.count } }
用法
"string".length
如果你只是想看看一个string是否为空(检查长度为0),Swift在String
上提供了一个简单的布尔testing方法
myString.isEmpty
这个硬币的另一面是人们在ObjectiveC中询问如何问一个string是否为空,答案是检查长度为0:
NSString是空的
tl; dr如果需要根据人类可读字符的数量计算stringtypes的长度,请使用countElements() 。 如果要根据扩展字形集群的数量知道长度,请使用endIndex 。 请阅读详细信息。
stringtypes被实现为Unicode字符的有序集合(即,序列),并且符合CollectionType协议,该协议符合_CollectionType协议,该协议是countElements()所期望的inputtypes。 因此,可以调用countElements() ,传递一个Stringtypes,并返回字符数。
但是,根据CollectionType (依次符合_CollectionType) , String还实现了startIndex和endIndex计算属性,它们分别实际表示了第一个字符集之前的索引位置和最后一个字符集之后的索引位置。 因此,在string“ABC”中,A之前的索引位置为0,C之后的位置为3.因此, endIndex = 3,也就是string的长度。
那么, endIndex可以用来获取任何stringtypes的长度,那么,对吧?
那么,并不总是… Unicode字符实际上是扩展的字形集群 ,它是一个或多个 Unicode标量的序列组合,以创build一个单一的人类可读的字符。
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
circledStar是由U + 2606(一颗白色星)和U + 20DD(一个组合的封闭圆)组成的单个字符。 让我们从circledStar创build一个string ,并比较countElements()和endIndex的结果。
let circledStarString = "\(circledStar)" countElements(circledStarString) // 1 circledStarString.endIndex // 2
在Swift 2.0中, count
不起作用了。 你可以用它来代替:
var testString: String = "Scott" var length = testString.characters.count
这里比使用全局函数更短,更自然:
aString.utf16count
不过,我不知道它是否可用于testing版1。 但是它在testing版2中绝对存在。
从Swift 1.2开始, utf16Count
已被删除。 您现在应该使用全局count()
函数并传递string的UTF16视图。 下面的例子…
let string = "Some string" count(string.utf16)
更新Xcode 6 beta 4,更改方法utf16count – > utf16Count
var test1: String = "Scott" var length = test1.utf16Count
要么
var test1: String = "Scott" var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
对于XCode 7.3和Swift 2.2。
let str = "🐶"
1)如果你想要的视觉人物的数量:
str.characters.count // 1
2)如果你想要在16-bit code units within the string's UTF-16 representation
的16-bit code units within the string's UTF-16 representation
:
str.utf16.count // 2
大多数情况下,1)是你需要的。
你什么时候需要2)? 我find了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 2.x中以下是如何find一个string的长度
let findLength = "This is a string of text" findLength.characters.count
返回24
你可以试试这个
var test1: String = "Scott" var length = test1.bridgeToObjectiveC().length
Swift 2.0:获取一个计数: yourString.text.characters.count
有趣的例子是如何在UITextView中显示某个数字(例如150)的字符倒数:
func textViewDidChange(textView: UITextView) { yourStringLabel.text = String(150 - yourStringTextView.text.characters.count) }
在Xcode 6.1.1
extension String { var length : Int { return self.utf16Count } }
我认为脑子会改变每一个小版本。
从你的textview或文本字段获取string值:
let textlengthstring = (yourtextview?.text)! as String
查找string中字符的数量:
let numberOfChars = textlength.characters.count
var str = "Hello, playground" var newString = str as NSString countElements(str)
这将计数Regular Swift String中的字符
countElements((newString as String))
这会计算NSString中的字符
在Swift中计数string的最佳方法是:
var str = "Hello World" var length = count(str.utf16)
string和NSString是免费桥,所以你可以使用所有可用的方法与NSString与SWIFTstring
let x = "test" as NSString let y : NSString = "string 2" let lenx = x.count let leny = y.count
test1.characters.count
会得到你string中的字母/数字等的数量。
例如:
test1 = "StackOverflow" print(test1.characters.count)
( 打印 “ 13 ”)
苹果公司与其他主要语言不同。 目前的方式是打电话给:
test1.characters.count
但是,要小心,当你说长度的时候,你的意思是字符数而不是字节数,因为当你使用非ASCII字符的时候,这两个字符可以是不同的。
例如; "你好啊hi".characters.count
会给你5,但这不是字节的计数。 为了得到真正的字节数,你需要做"你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
。 这会给你11。
现在(在Swift 2.3中)如果你使用:
myString.characters.count
该方法将返回一个“距离”types,如果你需要返回一个Integer的方法,你应该像这样input:
var count = myString.characters.count as Int
这是我最终做的
let replacementTextAsDecimal = Double(string) if string.characters.count > 0 && replacementTextAsDecimal == nil && replacementTextHasDecimalSeparator == nil { return false }
Swift 4与Swift 4相比更新
Swift 4不需要String上的字符数组。 这意味着你可以直接调用一个string而不用先获取字符数组。
"hello".count // 5
而在swift 3中,你将不得不获得字符数组,然后对该数组中的元素进行计数。 请注意,以下方法在swift 4.0中仍然可用,因为您仍然可以调用characters
来访问给定string的字符数组
"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
Swift 4.0
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"
如果你正在寻找一个更干净的方式来获得一个string结帐的长度这个库有一堆扩展到Swift中build立类http://www.dollarswift.org/#length
使用这个库,你可以做"Some Str".length
使用Xcode 6.4 , Swift 1.2和iOS 8.4 :
//: Playground - noun: a place where people can play import UIKit var str = " He\u{2606} " count(str) // 7 let length = count(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())) as Int // 3 println(length == 3) // true
您可以将此function添加到您的扩展
extension NSString { func charLength() -> Int { return count(self as String) } }
目标C: – String.length Swift2.0: – String.character.count