获取字符串的长度

如何获得String的长度?例如,我定义了一个变量,如下所示:

var test1: String = "Scott"

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

528506 次浏览

关于Swift 4+

它只是:

test1.count

是有原因的。

(感谢Martin R)

关于Swift 2:

在Swift 2中,Apple将全局函数更改为协议扩展,这些扩展与符合协议的任何类型匹配。因此,新语法是:

test1.characters.count

(感谢约翰·迪福尔的提醒)

关于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.utf16号

你可以试试这样

var test1: String = "Scott"var length =  test1.bridgeToObjectiveC().length

TLDR:

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

在Swift中计算字符

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

test1.characters.count

它将返回String中Unicode字符的实际数量,因此它是最正确的替代方案,因为如果您手动打印字符串和计数字符,您将获得相同的结果。

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

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

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

从语言参考:

扩展字位簇可以由一个或多个Unicode组成标量。这意味着不同的字符-和不同的相同字符的表示-可能需要不同数量的要存储的内存。正因为如此,Swift中的字符不会每个都接受在字符串表示形式中增加相同数量的内存。作为结果,无法计算字符串中的字符数无需遍历字符串以确定其扩展字位群集边界。如果您正在使用特别长的字符串值,请注意字符属性必须迭代整个字符串中的Unicode标量,以便确定该字符串的字符。

字符属性返回的字符数不始终与包含以下内容的NSString的长度属性相同相同的字符。NSString的长度基于数字字符串的UTF-16表示中的16位代码单元,而不是字符串中Unicode扩展字位簇的数量。

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

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

这里有一些比使用全局函数更短,更自然的东西:

aString.utf16count

我不知道它是否在beta 1中可用,但它肯定在beta 2中。

针对Xcode 6 beta 4更新,更改方法utf16count-->utf16Count

 var test1: String = "Scott"var length =  test1.utf16Count

 var test1: String = "Scott"var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)

如果您只是想查看字符串是否为空(检查长度为0),Swift在String上提供了一个简单的布尔测试方法

myString.isEmpty

这个硬币的另一面是人们在ObjectiveC中询问如何询问字符串是否为空,答案是检查长度为0:

NSString是空的

tl; dr如果您想要以人类可读字符的数量来计算String类型的长度,请使用CountElements()计算方法。如果您想知道以扩展字位簇的数量来计算长度,请使用endIndex。继续阅读以了解详细信息。

String类型实现为Unicode字符的有序集合(即序列),它符合数据类型协议,符合_CollectionType协议,这是CountElements()计算方法期望的输入类型。因此,可以调用CountElements()计算方法,传递String类型,它将返回字符计数。

然而,在符合数据类型(又符合_CollectionType)的情况下,String还实现了开始索引endIndex的计算属性,它们实际上分别表示索引之前的第一个字符簇的位置和索引之后的最后一个字符簇的位置。因此,在字符串“ABC”中,索引在A之前的位置是0,在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) // 1circledStarString.endIndex // 2
var str = "Hello, playground"var newString = str as NSString
countElements(str)

这将计算常规Swift字符串中的字符

countElements((newString as String))

这计算NSString中的字符

Swift1.1

extension String {var length: Int { return countElements(self) }  //}

Swift1.2

extension String {var length: Int { return count(self)         }  //}

Swift2.0

extension String {var length: Int { return characters.count    }  //}

Swift4.2

extension String {var length: Int { return self.count }}

let str = "Hello"let count = str.length    // returns 5 (Int)

如果您正在寻找一种更干净的方法来获取字符串的长度,请查看这个库,它有一堆内置类http://www.dollarswift.org/#length的Swift扩展

使用这个库,你可以只做"Some Str".length

自Swift 1.2utf16Count已被删除。您现在应该使用全局count()函数并传递字符串的UTF16视图。下面的示例…

let string = "Some string"count(string.utf16)

在Xcode 6.1.1中

extension String {var length : Int { return self.utf16Count  }}

我认为Brainiacs会在每个小版本上改变这一点。

在Swift中计算String的最佳方法是:

var str = "Hello World"var length = count(str.utf16)

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

Swift 2.0、3.0和3.1:

设strLth=string.characters.count

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

设string.count

在Swift 2.0count中不再工作。你可以使用这个代替:

var testString = "Scott"var length = testString.characters.count

String和NSString是免费桥接,因此您可以使用所有可用的方法来NSString与swft String

let x = "test" as NSStringlet y : NSString = "string 2"let lenx = x.countlet leny = y.count

使用xcode 6.4Swift1.2iOS8.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 // 3println(length == 3) // true

您可以将此功能添加到您的扩展

extension NSString {func charLength() -> Int {return count(self as String)}}

Swift 2.0:获取计数:yourString.text.characters.count

这是如何有用的有趣例子是在UITextView中显示某个数字(例如150)的字符倒计时:

func textViewDidChange(textView: UITextView) {yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)}

在Swift 2. x中,以下是如何找到字符串的长度

let findLength = "This is a string of text"findLength.characters.count

返回24

您可以使用SwiftString(https://github.com/amayne/SwiftString)来执行此操作。

"string".length // 6

上一篇:我写了这个扩展

test1.characters.count

将获得字符串中的字母/数字等的数量。

例如:

test1 = "StackOverflow"
print(test1.characters.count)

印刷品"13")

你可以使用str.utf8.countstr.utf16.count,我认为这是最好的解决方案

适用于Xcode 7.3和Swift 2.2。

let str = "🐶"
  1. 如果需要可视字符的数量:

    str.characters.count
  2. If you want the "16-bit code units within the string’s UTF-16 representation":

    str.utf16.count

Most of the time, 1 is what you need.

When would you need 2? I've found a use case for 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🐶🐶🐶

Apple使其与其他主要语言不同。当前的方法是调用:

test1.characters.count

但是,要小心,当您说长度时,您指的是字符数而不是字节数,因为当您使用非ascii字符时,这两个字符可能会不同。

例如:"你好啊hi".characters.count会给你5,但这不是字节数。要获得真正的字节数,您需要执行"你好啊hi".lengthOfBytes(using: String.Encoding.utf8)。这将为您提供11。

现在(在Swift 2.3中)如果您使用:

myString.characters.count

该方法将返回一个“距离”类型,如果您需要该方法返回一个整数,您应该像这样键入cast:

var count = myString.characters.count as Int

从文本视图或文本字段获取字符串值:

let textlengthstring = (yourtextview?.text)! as String

查找字符串中字符的计数:

let numberOfChars = textlength.characters.count

Swift4

"string".count

;)

Swift3

extension String {var length: Int {return self.characters.count}}

使用

"string".length

这是我最后做的

let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&replacementTextAsDecimal == nil &&replacementTextHasDecimalSeparator == nil {return false}

Swift 4更新与Swift 3比较

Swift 4不再需要String上的字符数组。这意味着您可以直接在字符串上调用count,而无需先获取字符数组。

"hello".count                  // 5

而在Swift 3中,您必须获取字符数组,然后在该数组中计算元素。请注意,以下方法在Swift 4.0中仍然可用,因为您仍然可以调用characters来访问给定字符串的字符数组

"hello".characters.count       // 5

Swift 4.0也采用了Unicode 9,它现在可以解释字位簇。例如,对表情符号的计数会给你1,而在Swift 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 5.1,5

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"

我的两分钱给Swift 3/4

如果你需要有条件地编译

    #if swift(>=4.0)let len = text.count#elselet len = text.characters.count#endif

test1.endIndex在Swift 3上给出了与test1.characters.count相同的结果

通用Swift 4和3解决方案

/*** 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)}}

Swift4

let str =  "Your name"
str.count

记住:空间也算在数字中

Swift4中:如果字符串不包含Unicode字符,则使用以下

let str : String = "abcd"let count = str.count // output 4

如果字符串包含Unicode字符,则使用以下命令:

let spain = "España"let count1 = spain.count // output 6let count2 = spain.utf8.count // output 7

您可以通过编写扩展来获取长度:

extension String {// MARK: Use if it's Swift 2func stringLength(str: String) -> Int {return str.characters.count}
// MARK: Use if it's Swift 3func stringLength(_ str: String) -> Int {return str.characters.count}
// MARK: Use if it's Swift 4func stringLength(_ str: String) -> Int {return str.count}}

在Swift 4.1和Xcode 9.4.1中

在Objectivec和Swift中获取长度是不同的。在Obj-c中,我们使用长度属性,但在Swift中,我们使用计数属性

示例:

//In Swiftlet stringLenght = "This is my String"print(stringLenght.count)
//In Objective cNSString * stringLenght = @"This is my String";NSLog(@"%lu", stringLenght.length);

在Swift4中,我一直使用string.count直到今天,我发现

string.endIndex.encodedOffset

是更好的替换,因为它更快-对于50,000个字符的字符串比.count快6倍。.count取决于字符串长度,但.endIndex.encodedOffset没有。

但是有一个NO。它对带有表情符号的字符串不好,它会给出错误的结果,所以只有.count是正确的。

在Swift 4.2和Xcode 10.1中

在Swift中,字符串可以被视为单个字符的数组。因此字符串中的每个字符都像数组中的一个元素。要获取字符串的长度,请使用yourStringName.count属性。

Swift

yourStringName.characters.count属性已弃用。所以直接使用strLength.count属性。

let strLength = "This is my string"print(strLength.count)//print(strLength.characters.count) //Error: 'characters' is deprecated: Please use String or Substring directly

如果目标c

NSString *myString = @"Hello World";NSLog(@"%lu", [myString length]); // 11

Swift 5.0字符串可以被视为单个字符的数组。因此,要返回字符串的长度,您可以使用yourString.count来计算字符数组中的项数。