Get the length of a String
你是如何得到一个
1 | var test1: String ="Scott" |
但是,在字符串上似乎找不到长度方法。
斯威夫特4
只是:
1 | test1.count |
理由。
(感谢马丁R)
斯威夫特2:
有了Swift2,苹果将全球功能改为协议扩展,即与任何符合协议的类型相匹配的扩展。因此,新的语法是:
1 | test1.characters.count |
(多亏了约翰迪愚的支持)
斯威夫特1
使用计数字符方法:
1 2 3 | let unusualMenagerie ="Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪" println("unusualMenagerie has \(count(unusualMenagerie)) characters") // prints"unusualMenagerie has 40 characters" |
就在苹果环球旅行指南的右边
(注:对于早于1.2的swift版本,应改为
对于您的变量,它将是
1 | length = count(test1) // was countElements in earlier versions of Swift |
或者可以使用test1.utf16count
TLDR:
对于Swift 2.0和3.0,使用
在Swift2.0之前,
1 | test1.characters.count |
它将返回一个
但是,由于
例如,您还可以使用
但是,如下文所述,返回值不保证与调用
从语言参考:
Extended grapheme clusters can be composed of one or more Unicode
scalars. This means that different characters—and different
representations of the same character—can require different amounts of
memory to store. Because of this, characters in Swift do not each take
up the same amount of memory within a string’s representation. As a
result, the number of characters in a string cannot be calculated
without iterating through the string to determine its extended
grapheme cluster boundaries. If you are working with particularly long
string values, be aware that the characters property must iterate over
the Unicode scalars in the entire string in order to determine the
characters for that string.The count of the characters returned by the characters property is not
always the same as the length property of an NSString that contains
the same characters. The length of an NSString is based on the number
of 16-bit code units within the string’s UTF-16 representation and not
the number of Unicode extended grapheme clusters within the string.
如注释中的n0neimp0rtant所指出的,一个完美地说明上述情况的示例是检查包含单个emoji字符的字符串的长度。
1 2 3 | 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:
let strLength = string.characters.count
Swift 4.2(4.0以后):[苹果文档-字符串]
let strLength = string.count
斯威夫特1.1
1 2 3 | extension String { var length: Int { return countElements(self) } // } |
斯威夫特1.2
1 2 3 | extension String { var length: Int { return count(self) } // } |
斯威夫特2
1 2 3 | extension String { var length: Int { return characters.count } // } |
斯威夫特4.2
1 2 3 | extension String { var length: Int { return self.count } } |
1 2 | let str ="Hello" let count = str.length // returns 5 (Int) |
斯威夫特4
;)
斯威夫特3
1 2 3 4 5 | extension String { var length: Int { return self.characters.count } } |
使用
如果您只是想查看一个字符串是否为空(检查长度是否为0),swift在
1 | myString.isEmpty |
这枚硬币的另一面是人们客观性地询问如何询问一个字符串是否是空的,答案在哪里检查长度为0:
nsstring为空
tl;dr如果您希望字符串类型的长度与人类可读字符的数量有关,请使用countelements()。如果您想知道扩展图形簇的长度,请使用endindex。请继续阅读以了解详细信息。
字符串类型被实现为Unicode字符的有序集合(即序列),并且它符合CollectionType协议,后者符合_CollectionType协议,后者是CountElements()预期的输入类型。因此,可以调用CountElements(),传递字符串类型,它将返回字符数。
但是,在符合collectiontype(反过来又符合collectiontype)的情况下,string还实现startindex和endindex计算属性,这些属性实际上分别表示索引在第一个字符集群之前的位置和索引在最后一个字符集群之后的位置。所以,在字符串"abc"中,索引在a之前的位置是0,在c之后的位置是3。因此,endindex=3,这也是字符串的长度。
那么,endindex可以用来获取任何字符串类型的长度,对吗?
好吧,并不总是……Unicode字符实际上是扩展的图形簇,它是一个或多个Unicode标量组合的序列,以创建一个人类可读的字符。
1 | let circledStar: Character ="\u{2606}\u{20DD}" // ☆? |
圆圈星是由U+2606(白星)和U+20dd(组合包围圈)组成的单个字符。让我们从CircledStar创建一个字符串,并比较CountElements()和EndIndex的结果。
1 2 3 | let circledStarString ="\(circledStar)" countElements(circledStarString) // 1 circledStarString.endIndex // 2 |
这里有一些比使用全局函数更短、更自然的方法:
1 | aString.utf16count |
不过,我不知道它是否在beta 1中可用。但它在测试版2中是绝对存在的。
在Swift2.0中,
1 2 | var testString ="Scott" var length = testString.characters.count |
更新Xcode6 beta 4,更改方法utf16count->utf16count
1 2 | var test1: String ="Scott" var length = test1.utf16Count |
或
1 2 | var test1: String ="Scott" var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding) |
自Swift 1.2起,
1 2 | let string ="Some string" count(string.utf16) |
你可以试试这个
1 2 | var test1: String ="Scott" var length = test1.bridgeToObjectiveC().length |
对于Xcode 7.3和Swift 2.2。
1 | let str ="??" |
1)如果需要可视字符数:
1 | str.characters.count // 1 |
2)如果您需要
1 | str.utf16.count // 2 |
大多数情况下,1)是你需要的。
你什么时候需要2个?我找到了一个2)的用例:
1 2 3 4 5 6 7 | 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),则结果不正确:
1 2 3 4 | let result = regex.stringByReplacingMatchesInString(str, options: NSMatchingOptions.WithTransparentBounds, range: NSMakeRange(0, str.characters.count), withTemplate:"dog") print(result) // dogdogdog?????? |
在swift 2.x中,以下是如何查找字符串的长度
1 2 | let findLength ="This is a string of text" findLength.characters.count |
返回24
斯威夫特2:计数:
在uitextview中显示某个数字(例如150)的字符倒计时是如何有用的有趣示例:
1 2 3 | func textViewDidChange(textView: UITextView) { yourStringLabel.text = String(150 - yourStringTextView.text.characters.count) } |
斯威夫特5
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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" |
在swift4中,我一直使用
1 | string.endIndex.encodedOffset |
是更好的替换,因为它更快-对于50000个字符,字符串比
但是有一个不,它不适合使用emojis的字符串,它会给出错误的结果,所以只有
在SWIFT 4中:如果字符串不包含Unicode字符,请使用以下内容
1 2 | let str : String ="abcd" let count = str.count // output 4 |
如果字符串包含Unicode字符,请使用以下字符:
1 2 3 | let spain ="Espa?a" let count1 = spain.count // output 6 let count2 = spain.utf8.count // output 7 |
只需编写一个扩展名即可获得长度:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 } } |
斯威夫特4
1 2 3 | let str = "Your name" str.count |
记住:空格也算在数字中
在XCOD6.1.1
1 2 3 | extension String { var length : Int { return self.utf16Count } } |
我认为每个次要版本的大脑都会改变这个。
从textView或textfield获取字符串值:
1 | let textlengthstring = (yourtextview?.text)! as String |
查找字符串中的字符数:
1 | let numberOfChars = textlength.characters.count |
这就是我最后所做的
1 2 3 4 5 6 7 | let replacementTextAsDecimal = Double(string) if string.characters.count > 0 && replacementTextAsDecimal == nil && replacementTextHasDecimalSeparator == nil { return false } |
我的2美分是3/4雨燕
如果需要有条件地编译
1 2 3 4 5 | #if swift(>=4.0) let len = text.count #else let len = text.characters.count #endif |
如果您使用:
1 | myString.characters.count |
该方法将返回一个"距离"类型,如果需要该方法返回一个整数,则应按如下方式进行类型转换:
1 | var count = myString.characters.count as Int |
string和nsstring是免费的网桥,因此您可以使用具有swift字符串的nsstring可用的所有方法。
1 2 3 4 | let x ="test" as NSString let y : NSString ="string 2" let lenx = x.count let leny = y.count |
与Swift 3相比,Swift 4更新
swift 4不需要字符串上的字符数组。这意味着您可以在字符串上直接调用
1 | "hello".count // 5 |
而在Swift 3中,您必须获取字符数组,然后计算该数组中的元素。请注意,以下方法在swift 4.0中仍然可用,因为您仍然可以调用
1 | "hello".characters.count // 5 |
Swift4.0也采用了Unicode9,现在它可以解释图形集群。例如,在Swift 3.0中,计数emoji将给您1,而计数可能大于1。
1 2 | "????".count // Swift 4.0 prints 1, Swift 3.0 prints 2 "???????????".count // Swift 4.0 prints 1, Swift 3.0 prints 4 |
苹果使它不同于其他主要语言。目前的方法是:
测试1.characters.count
但是,要小心,当您说长度时,您的意思是字符数而不是字节数,因为当您使用非ASCII字符时,这两个字符可能不同。
例如;
1 | test1.characters.count |
将得到字符串中的字母/数字等数字。
前任:
1 2 3 | test1 ="StackOverflow" print(test1.characters.count) |
(打印13)
用swift计算字符串的最佳方法是:
1 2 | var str ="Hello World" var length = count(str.utf16) |
1 2 3 4 | var str ="Hello, playground" var newString = str as NSString countElements(str) |
这将计算常规swift字符串中的字符数
1 | countElements((newString as String)) |
这将统计nsstring中的字符数
在Swift 4.1和Xcode 9.4.1中
在目标C和Swift中获取长度是不同的。在obj-c中我们使用length属性,但在swift中我们使用count属性
例子:
1 2 3 4 5 6 7 | //In Swift let stringLenght ="This is my String" print(stringLenght.count) //In Objective c NSString * stringLenght = @"This is my String"; NSLog(@"%lu", stringLenght.length); |
你可以使用
在Swift 4.2和Xcode 10.1中
在swift中,字符串可以被视为单个字符的数组。所以字符串中的每个字符都像数组中的一个元素。要获取字符串的长度,请使用YoursTringName.Count属性。
在Swift
1 2 3 | let strLength ="This is my string" print(strLength.count) //print(strLength.characters.count) //Error: 'characters' is deprecated: Please use String or Substring directly |
如果目标C
1 2 | NSString *myString = @"Hello World"; NSLog(@"%lu", [myString length]); // 11 |
通用Swift 4和3解决方案
1 2 3 4 5 6 7 8 9 10 | /** * Since swift 4 There is also native count, But it doesn't return Int * NOTE: was: var count:Int { return self.characters.count } * EXAMPLE:"abc??".count//Output: 4 */ extension String{ var count:Int { return self.distance(from: self.startIndex, to: self.endIndex) } } |
在Swift 3上,
使用Xcode 6.4、Swift 1.2和iOS 8.4:
1 2 3 4 5 6 7 8 9 | //: 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 |
您可以将此函数添加到扩展中
1 2 3 4 5 | extension NSString { func charLength() -> Int { return count(self as String) } } |
您可以使用Swiftstring(https://github.com/amayne/Swiftstring)来执行此操作。
免责声明:我写了这个扩展名
如果您正在寻找一种更清晰的方法来获取字符串的长度,那么这个库有许多对swift内置类的扩展http://www.dollarswift.org/length
使用这个库,您只需执行EDOCX1[0]