获取String的长度

Sco*_*ter 765 string swift

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

var test1: String = "Scott"
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*inn 1248

截至Swift 4

只是:

test1.count
Run Code Online (Sandbox Code Playgroud)

原因.

(感谢Martin R)

截至Swift 2:

使用Swift 2,Apple已将全局功能更改为协议扩展,扩展符合符合协议的任何类型.因此新的语法是:

test1.count
Run Code Online (Sandbox Code Playgroud)

(感谢JohnDifool的提醒)

截至Swift 1

使用计数字符方法:

test1.characters.count
Run Code Online (Sandbox Code Playgroud)

就在Apple Swift指南中

(注意,对于早于1.2的Swift版本,这将是.count相反的)

对于你的变量,它会

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
Run Code Online (Sandbox Code Playgroud)

或者您可以使用test1.utf16count

  • 添加str.length方法太难了.(愤怒地举起拳头) (282认同)
  • 使用Swift 2,我只能让它工作:让len = test1.characters.count (12认同)
  • 有趣的是countElements是一个全局函数.是否有全球职能清单? (10认同)
  • countElements的问题在于它被声明如下:func countElements <T>(x:T) - > T.IndexType.DistanceType并且返回类型不接受+操作. (6认同)
  • 请注意,使用Swift 4,它将是`string.count`. (6认同)
  • @ScottWalter:cmd-单击Swift符号(例如:String),你就可以了.靠近生成的文件的顶部. (5认同)
  • countElements已被swift 1.2中的count替换(beta 1)不再有单独的countElements调用来计算集合的大小和范围的计数 - 现在只计算两者. (4认同)
  • 没有添加"长度"方法是荒谬的.这种语言几乎不具备beta质量,更不用说发布质量了. (4认同)
  • @milesper注意,这是一个O(n)操作,*不与(str as NSString).length相同,相当于str.utf16.count,是O(1) (3认同)
  • 那么Apple在一年内改变了这个简单的功能三次?!我是唯一感觉脚下颤抖的地方吗? (2认同)
  • 一种即时编写的语言 - 添加一些关于雨燕飞行的评论 (2认同)
  • 这是一个陷阱!他们希望您专注于不断更改新语言结构的代码,而不是专注于生产力.然后他们弃用旧的结构,以便你不断地继续跳舞.:/ (2认同)

Cez*_*zar 334

TLDR:

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

在Swift中计算字符数

在Swift 2.0之前,它count是一个全局函数.从Swift 2.0开始,它可以被称为成员函数.

test1.characters.count
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是,如下文所述,返回值不保证是相同的调用countcharacters.

从语言参考:

扩展的字形集群可以由一个或多个Unicode标量组成.这意味着不同的字符和相同字符的不同表示可能需要不同的内存量来存储.因此,Swift中的字符不会在字符串表示中占用相同数量的内存.因此,如果不迭代字符串以确定其扩展的字形集群边界,则无法计算字符串中的字符数.如果您正在使用特别长的字符串值的工作,要知道,在人物属性必须遍历整个字符串中的Unicode标量,以确定该字符串中的字符.

characters属性返回的字符数不总是与包含相同字符的NSString的length属性相同.NSString的长度基于字符串的UTF-16表示中的16位代码单元的数量,而不是字符串中Unicode扩展的字形集群的数量.

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

var emoji = ""
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2
Run Code Online (Sandbox Code Playgroud)

  • 我很感激你的详细和谨慎的答案,但我不得不承认这让我感到不安.你给了我三种方法来获得一个字符串的长度,所有这些都有免责声明,他们给出的答案可能不是你所期望的.是否真的没有可靠的方法内置到Swift中以获得准确,可靠的字符串长度值? (25认同)
  • @ n00neimp0rtant.对不起,如果我没说清楚.第一个解决方案(`countElements()`)获取String中的确切字符数.它可能与你在Objective-C中调用`[str length]`得到的不同,因为`length`方法假设字符串中的所有字符都由16位代码单元组成,而`countElements()`获取Unicode字符的实际数量.但是,大多数情况下,所有上述替代方案都会返回相同的结果,特别是如果您正在使用英语常用字符. (6认同)
  • @ n00neimp0rtant我稍微调整了一下我的答案,试着让它更清晰. (2认同)
  • 我明白你的意思了.我只是尝试获取包含单个表情符号字符的字符串的长度; Objective-C给了我4的值,Swift给了我1的值.所以它实际上看起来更准确(因此,具有讽刺意味的是"不是我所期望的"= P).谢谢你的澄清! (2认同)

San*_*San 91

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

Swift 2.0,3.0和3.1:

让strLength = string.characters.count

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

让strLength = string.count


whi*_*and 59

extension String {
    var length: Int { return countElements(self) }  // 
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我们需要一个Swift语法的抽象层,它每月都在变化! (6认同)

Vya*_*lav 47

斯威夫特4

"string".count

;)

斯威夫特3

extension String {
    var length: Int {
        return self.characters.count
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

"string".length


Ken*_*ner 24

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

myString.isEmpty
Run Code Online (Sandbox Code Playgroud)

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

NSString为空


Sco*_*ner 18

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

字符串型被实现为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}" // ??
Run Code Online (Sandbox Code Playgroud)

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

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
Run Code Online (Sandbox Code Playgroud)


Ant*_*ine 15

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

var testString = "Scott"
var length = testString.characters.count
Run Code Online (Sandbox Code Playgroud)


Jea*_*nan 14

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

aString.utf16count
Run Code Online (Sandbox Code Playgroud)

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

  • 见Cezar的回答.对于大多数人对"字符"的定义,这不一定会给出字符串中"字符"的数量.然后,Objective-C也没有 - 由你来决定你是否关心. (2认同)

小智 11

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

 var test1: String = "Scott"
 var length =  test1.utf16Count
Run Code Online (Sandbox Code Playgroud)

要么

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
Run Code Online (Sandbox Code Playgroud)


Jer*_*Fox 10

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

let string = "Some string"
count(string.utf16)
Run Code Online (Sandbox Code Playgroud)


Sar*_*ith 10

斯威夫特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"
Run Code Online (Sandbox Code Playgroud)


Ani*_*ese 7

你可以这样试试

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length
Run Code Online (Sandbox Code Playgroud)

  • 这与`test1.utf16count`相同 (4认同)

Tyl*_*ong 7

对于XCode 7.3和Swift 2.2.

let str = ""
Run Code Online (Sandbox Code Playgroud)

1)如果你想要视觉角色的数量:

str.characters.count // 1
Run Code Online (Sandbox Code Playgroud)

2)如果你想要16-bit code units within the string’s UTF-16 representation:

str.utf16.count // 2
Run Code Online (Sandbox Code Playgroud)


大多数时候,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
Run Code Online (Sandbox Code Playgroud)

如果使用1),结果不正确:

let result = regex.stringByReplacingMatchesInString(str, 
    options: NSMatchingOptions.WithTransparentBounds, 
    range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 6

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

let findLength = "This is a string of text"
findLength.characters.count
Run Code Online (Sandbox Code Playgroud)

返回24


VYT*_*VYT 6

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

string.endIndex.encodedOffset
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

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

func textViewDidChange(textView: UITextView) {
    yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*aha 5

Swift 4中:\n如果字符串不包含 unicode 字符,则使用以下内容

\n\n
let str : String = "abcd"\nlet count = str.count // output 4\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
let spain = "Espa\xc3\xb1a"\nlet count1 = spain.count // output 6\nlet count2 = spain.utf8.count // output 7\n
Run Code Online (Sandbox Code Playgroud)\n