获取String的长度

问题描述 投票:747回答:40

你怎么得到String的长度?例如,我有一个变量定义如下:

var test1: String = "Scott"

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

swift string
40个回答
1211
投票

截至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

或者您可以使用测试1.utf 16计数


10
投票

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

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

要么

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

10
投票

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

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

7
投票

对于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

str.utf16.count // 2



大多数时候,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🐶🐶🐶

7
投票

你可以这样试试

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

6
投票

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

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

返回24


5
投票

Swift 2.0:算一算:yourString.text.characters.count

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

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

5
投票

Swift 4.2

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"

3
投票

在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

3
投票

在swift4中,我一直使用string.count直到今天我已经找到了

string.endIndex.encodedOffset

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

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


2
投票

在Xcode 6.1.1中

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

我认为brainiacs会在每个次要版本上改变这一点。


332
投票

TLDR:

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

Counting characters in Swift

在Swift 2.0之前,count是一个全球性的功能。从Swift 2.0开始,它可以被称为成员函数。

test1.characters.count

它将返回String中的实际Unicode字符数,因此它是最正确的替代方法,如果你打印字符串并手动计算字符,你会得到相同的结果。

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

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

但是,如下所述,返回的值不能保证与在count上调用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

2
投票

从textview或textfield获取字符串值:

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

查找字符串中的字符数:

let numberOfChars = textlength.characters.count

2
投票

这就是我最终做的事情

let replacementTextAsDecimal = Double(string)

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

2
投票

斯威夫特4

let str =  "Your name"

str.count 

请记住:空格也计入数字中


2
投票

只需编写一个扩展名即可获得长度:

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
    }
}

1
投票
var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

这会计算Regular Swift String中的字符数

countElements((newString as String))    

这会计算NSString中的字符数


1
投票

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

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

1
投票

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

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

1
投票
test1.characters.count

会告诉你字符串中的字母/数字等数量。

例如:

test1 = "StackOverflow"

print(test1.characters.count)

(打印“13”)


1
投票

Apple使其与其他主要语言不同。目前的方式是打电话:

test1.characters.count

但是,要注意,当你说长度时,你的意思是字符数而不是字节数,因为当你使用非ascii字符时,这两个字符可能会有所不同。

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


1
投票

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

myString.characters.count 

该方法将返回一个“距离”类型,如果你需要返回一个Integer的方法,你应该像这样输入:

var count = myString.characters.count as Int

90
投票

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

Swift 2.0,3.0和3.1:

让strLength = string.characters.count

Swift 4.2(4.0起):[Apple Documentation - Strings]

让strLength = string.count


1
投票

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,它现在可以解释字形集群。例如,依靠表情符号将在swift 3.0中给你1,你可能得到大于1的计数。

"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨‍❤️‍💋‍👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4

58
投票

Swift 1.1

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

Swift 1.2

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

Swift 2.0

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

Swift 4.2

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

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

47
投票

斯威夫特4

"string".count

;)

斯威夫特3

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

用法

"string".length


22
投票

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

myString.isEmpty

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

NSString is empty


18
投票

tl; dr如果您想根据人类可读字符的数量获取String类型的长度,请使用countElements()。如果您想知道扩展字形集群数量的长度,请使用endIndex。继续阅读以了解详情。

String类型实现为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}" // ☆⃝

circledStar是由U + 2606(白色星星)和U + 20DD(组合围圈)组成的单个角色。让我们从circledStar创建一个String,并比较countElements()和endIndex的结果。

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2

14
投票

这是比使用全局函数更短,更自然的东西:

aString.utf16count

不过,我不知道它是否可用于测试版1。但它绝对存在于测试版2中。


14
投票

在Swift 2.0中,count不再起作用了。您可以使用此代替:

var testString = "Scott"
var length = testString.characters.count
© www.soinside.com 2019 - 2024. All rights reserved.