获取字符串的长度

Get the length of a String

提问人:Scott Walter 提问时间:6/4/2014 最后编辑:user16217248Scott Walter 更新时间:10/13/2023 访问量:537004

问:

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

var test1: String = "Scott"

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

swift 字符串

评论

0赞 King-Wizard 9/19/2015
Swift 1.2 和 Swift 2.0 中字符串长度可能重复
0赞 Shkelzen 12/5/2016
由于 Swift 3,我不得不手动迁移大量代码。所以我决定创建扩展。所以现在,如果必须升级到新的主要版本,我只需要迁移扩展。在这里,你可以找到一些我创建的 Swift 3 扩展。github.com/tukur187/Swift3
0赞 WJA 1/3/2022
无论您选择哪种解决方案,您都可以使用在线工具交叉检查结果

答:

1369赞 mginn 6/4/2014 #1

从 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

评论

11赞 Scott Walter 6/4/2014
有趣的是,countElements 是一个全局函数。是否有全局函数列表?
5赞 Jean Le Moignan 6/19/2014
@ScottWalter:按住 cmd 键单击一个 Swift 符号(例如:字符串),你就会找到它们。靠近生成的文件的顶部。
302赞 botbot 12/13/2014
添加 str.length 方法太难了。(愤怒地举起拳头)
13赞 John Difool 6/10/2015
使用 Swift 2,我只能让它工作:let len = test1.characters.count
8赞 Martin R 5/19/2017
请注意,在 Swift 4 中,它将是 .string.count
9赞 Anil Varghese 6/4/2014 #2

你可以像这样试试

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

评论

4赞 Sulthan 6/4/2014
这和test1.utf16count
1赞 jbg 7/19/2014
@vladof好吧,它“有点”有效。请看塞扎尔的回答。
346赞 Cezar 6/4/2014 #3

顶级域名:

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

在 Swift 中计算字符数

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

test1.characters.count

它将返回 中 Unicode 字符的实际数量,因此从某种意义上说,这是最正确的选择,因为如果您打印字符串并手动计算字符数,则会得到相同的结果。String

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

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

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

从语言参考:

扩展字素簇可以由一个或多个 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

评论

26赞 n00neimp0rtant 6/6/2014
我很欣赏你详细而谨慎的回答,但我不得不承认这让我感到不安。你给了我 3 种方法来获取字符串的长度,所有这些都带有免责声明,即他们给出的答案可能不是你所期望的。Swift 中真的没有内置可靠的方法来获取字符串的准确、可靠的长度值吗?
6赞 Cezar 6/6/2014
@n00neimp0rtant。对不起,如果我没有说清楚。第一个解决方案()获取字符串中的确切字符数。它可能与在 Objective-C 中调用所得到的不同,因为该方法假定字符串中的所有字符都由 16 位代码单元组成,而获取实际的 Unicode 字符数。但是,大多数情况下,上述所有替代方案都会返回相同的结果,特别是如果您使用的是英语常用字符。countElements()[str length]lengthcountElements()
2赞 Cezar 6/6/2014
@n00neimp0rtant我稍微调整了一下我的答案,试图让它更清楚。
2赞 n00neimp0rtant 6/6/2014
我现在明白你的意思了。我只是尝试获取包含单个表情符号字符的字符串的长度;Objective-C 给我的值是 4,Swift 给我的值是 1。所以它实际上看起来更准确(因此,具有讽刺意味的是,“不是我所期望的”=P)。感谢您的澄清!
1赞 Cezar 6/6/2014
@n00neimp0rtant 确切地!这是一个很好的例子。我什至会把它添加到答案中
16赞 Jean Le Moignan 6/19/2014 #4

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

aString.utf16count

不过,我不知道它是否在 beta 1 中可用。但它肯定在测试版 2 中存在。

评论

2赞 jbg 7/19/2014
请看塞扎尔的回答。对于大多数人对“字符”的定义,这不一定会给你字符串中“字符”的数量。话又说回来,Objective-C 也没有——由你来决定你是否在乎。
13赞 Kiet Nguyen 7/22/2014 #5

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

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

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

评论

0赞 Victor Sigler 4/8/2015
当您将复杂字符串与表情符号一起使用时,答案将是错误的utf16count
26赞 Kendall Helmstetter Gelner 8/30/2014 #6

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

myString.isEmpty

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

NSString 为空

20赞 Scott Gardner 8/30/2014 #7

tl;dr 如果您想要 String 类型的长度与人类可读字符的数量有关,请使用 countElements()。如果您想知道扩展字素簇数的长度,请使用 endIndex。请继续阅读了解详情。

String 类型是作为 Unicode 字符的有序集合(即序列)实现的,它符合 CollectionType 协议,该协议符合 _CollectionType协议,该协议是 countElements() 预期的输入类型。因此,可以调用 countElements(),传递 String 类型,它将返回字符数。

但是,为了符合 CollectionType(而 CollectionType)又符合 _CollectionType,String 还实现了 startIndexendIndex 计算属性,这些属性实际上分别表示索引在第一个字符簇之前的位置,以及索引最后一个字符簇之后的位置。因此,在字符串“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
1赞 brokenrhino 10/14/2014 #8
var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

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

countElements((newString as String))    

这将计算 NSString 中的字符数

65赞 whitneyland 10/23/2014 #9

斯威夫特 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)

评论

6赞 Cosmin 6/4/2016
是的,我们需要一个 Swift 语法的抽象层,它每月都在变化!
0赞 Sentry.co 11/9/2017
@Lee 这在 swift 4 中不起作用。as 字符已弃用。打地鼠的奔跑仍在继续。叹息
-1赞 Encore PTL 11/23/2014 #10

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

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

12赞 Jeremy Fox 2/26/2015 #11

从 Swift 1.2 开始,已被删除。您现在应该使用全局函数并传递字符串的 UTF16 视图。示例如下...utf16Countcount()

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

评论

1赞 samir105 4/10/2015
它比 .utf16count 慢吗?
1赞 samir105 4/13/2015
它的速度似乎与 .utf16count 相同,比 count(string) 快得多
4赞 user3812138 3/12/2015 #12

在 Xcode 6.1.1 中

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

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

3赞 Zaldy Bughaw 4/13/2015 #13

在 Swift 中计算字符串的最佳方法是:

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

评论

2赞 Leo Dabus 4/14/2015
您应该只使用 count(str)。尝试将 count(str.utf16) 与子字符串 advance() 一起使用
97赞 San 4/15/2015 #14

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

Swift 2.0、3.0 和 3.1:

let strLength = 字符串.字符.计数

Swift 4.2(4.0 及更高版本):[Apple 文档 - 字符串]

let strLength = 字符串.计数

18赞 Antoine 6/14/2015 #15

在 Swift 2.0 中不再起作用。您可以改用它:count

var testString = "Scott"
var length = testString.characters.count
2赞 Tien Dinh 6/19/2015 #16

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

let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
0赞 King-Wizard 7/27/2015 #17

使用 Xcode 6.4Swift 1.2iOS 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
0赞 Prakash Raj 9/2/2015 #18

您可以将此函数添加到您的扩展中

extension NSString { 
    func charLength() -> Int {
        return count(self as String)
    }
}
7赞 cjd 10/1/2015 #19

斯威夫特 2.0: 获取计数:yourString.text.characters.count

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

func textViewDidChange(textView: UITextView) {
    yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
8赞 Adam 12/27/2015 #20

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

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

返回 24

-1赞 eurobrew 2/7/2016 #21

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

"string".length // 6

免责声明:我写了这个扩展

2赞 Andy Lebowitz 3/6/2016 #22
test1.characters.count

将为您提供字符串中的字母/数字等数量。

前任:

test1 = "StackOverflow"

print(test1.characters.count)

(指纹13")

0赞 euvl 5/15/2016 #23

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

11赞 Tyler Liu 7/3/2016 #24

适用于 Xcode 7.3 和 Swift 2.2。

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

    str.characters.count
    
  2. 如果您想要“字符串的 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🐶🐶🐶
2赞 Frank 8/29/2016 #25

苹果使它与其他主要语言不同。目前的方式是调用:

test1.characters.count

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

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

2赞 Jesse 9/1/2016 #26

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

myString.characters.count 

该方法将返回一个“Distance”类型,如果你需要该方法返回一个 Integer,你应该像这样键入 cast:

var count = myString.characters.count as Int

评论

2赞 Martin R 9/1/2016
,应该不需要这个演员表。DistanceString.CharacterViewInt
4赞 kalyan711987 12/22/2016 #27

从 textview 或 textfield 获取字符串值:

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

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

let numberOfChars = textlength.characters.count
52赞 Vyacheslav 12/25/2016 #28

斯威夫特 4

"string".count

;)

斯威夫特 3

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

用法

"string".length

评论

0赞 Sentry.co 11/9/2017
它返回 String.CharacterView.IndexDistance。那 Int 呢?
0赞 Vyacheslav 11/10/2017
@GitSync在哪里?我不明白你
0赞 Sentry.co 11/10/2017
在 swift 4 中@Vyacheslav “string”.count 返回 String.CharacterView.IndexDistance 在这里查看我的答案: stackoverflow.com/a/47203597/5389500 在 swift 3 和 4 中获取 int
0赞 Vyacheslav 11/10/2017
我已经测试过这是游乐场:
0赞 Vyacheslav 11/10/2017
//: 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))
4赞 Bryan Clark 4/26/2017 #29

这是我最终所做的

let replacementTextAsDecimal = Double(string)

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

评论

0赞 Fabio says Reinstate Monica 4/26/2017
我认为您尝试做的不仅仅是获取字符串的长度,无论如何这看起来不完整(不应该也有这种情况吗?你能仔细检查一下,以防万一,编辑你的答案吗?谢谢!return true
4赞 Fangming 7/12/2017 #30

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
23赞 Saranjith 8/4/2017 #31

斯威夫特 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"
2赞 ingconti 8/24/2017 #32

我的 Swift 3/4 两美分

如果需要有条件地编译

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

评论

0赞 Sentry.co 11/9/2017
好点子。我宁愿全面升级到 swift 4。
0赞 Thracian 8/27/2017 #33

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

0赞 Sentry.co 11/9/2017 #34

通用 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)
    }
}
4赞 Mr.Shin 11/14/2017 #35

斯威夫特 4

let str =  "Your name"

str.count 

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

5赞 Ashis Laha 12/9/2017 #36

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

评论

0赞 rmaddy 6/20/2019
为什么要使用?这没有给出字符数。它给出字符串的 UTF-8 编码所需的字节数。utf8.count
4赞 Riajur Rahman 1/16/2018 #37

你可以通过编写一个扩展来获得长度:

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
    }
}
0赞 Naresh 8/18/2018 #38

在 Swift 4.1 和 Xcode 9.4.1 中

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

例:

//In Swift
let stringLenght = "This is my String"
print(stringLenght.count)

//In Objective c
NSString * stringLenght = @"This is my String";
NSLog(@"%lu", stringLenght.length);
6赞 VYT 9/9/2018 #39

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

string.endIndex.encodedOffset

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

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

0赞 Naresh 3/25/2019 #40

在 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
0赞 Shantaram Kokate 7/5/2019 #41

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