获取String的长度

时间:2014-06-04 12:40:02

标签: swift string

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

var test1: String = "Scott"

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

41 个答案:

答案 0 :(得分:1220)

从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

答案 1 :(得分:332)

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

但是,如下所述,返回的值不能保证与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 :(得分: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

答案 3 :(得分: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)

答案 4 :(得分:47)

Swift 4

"string".count

Swift 3

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

使用

"string".length

答案 5 :(得分:22)

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

myString.isEmpty

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

NSString is empty

答案 6 :(得分:18)

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

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

但是,符合 CollectionType ,后者又符合 _CollectionType 字符串也会实现 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 创建字符串,并比较 countElements() endIndex 的结果。

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

答案 7 :(得分:14)

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

aString.utf16count
但是,我不知道它是否可以在测试版1中使用。但它确实存在于测试版2中。

答案 8 :(得分:14)

在Swift 2.0中 cmake_minimum_required(VERSION 2.8) add_subdirectory("./image") add_subdirectory("./math") add_subdirectory("./app1") add_subdirectory("./app2") 不再起作用了。您可以改为使用它:

count

答案 9 :(得分:10)

针对Xcode 6 beta 4更新,更改方法utf16count - &gt; utf16Count

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

或者

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

答案 10 :(得分:10)

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

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

答案 11 :(得分:7)

你可以尝试这样

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

答案 12 :(得分: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

答案 13 :(得分:6)

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

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

返回24

答案 14 :(得分:5)

Swift 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"

答案 15 :(得分:5)

Swift 2.0: 得到一个计数:yourString.text.characters.count

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

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

答案 16 :(得分: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

答案 17 :(得分:3)

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

string.endIndex.encodedOffset

是更好的替代方法,因为它更快-因为50000个字符的字符串比.count快6倍。 .count取决于字符串长度,而.endIndex.encodedOffset则不取决于字符串长度。

但是有一个NO。这对于带有表情符号的字符串不是很好,它将给出错误的结果,因此只有.count是正确的。

答案 18 :(得分: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
    }
}

答案 19 :(得分:2)

从textview或textfield获取字符串值:

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

查找字符串中的字符数:

let numberOfChars = textlength.characters.count

答案 20 :(得分:2)

这是我最终做的事情

let replacementTextAsDecimal = Double(string)

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

答案 21 :(得分:2)

在Xcode 6.1.1中

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

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

答案 22 :(得分:2)

Swift 4

let str =  "Your name"

str.count 

请记住:空格也计入数字

答案 23 :(得分:1)

test1.characters.count

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

例如:

test1 = "StackOverflow"

print(test1.characters.count)

打印 13 ”)

答案 24 :(得分:1)

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

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

答案 25 :(得分:1)

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

test1.characters.count

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

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

答案 26 :(得分:1)

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

myString.characters.count 

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

var count = myString.characters.count as Int

答案 27 :(得分:1)

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

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

答案 28 :(得分:1)

与swift 3相比,Swift 4更新

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

答案 29 :(得分:1)

我的两分钱为快速3/4

如果您需要有条件地编译

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

答案 30 :(得分:1)

var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

这会计算Regular Swift String中的字符

countElements((newString as String))    

这会计算NSString中的字符

答案 31 :(得分:0)

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

答案 32 :(得分:0)

在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

如果 Objective C

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

答案 33 :(得分:0)

在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);

答案 34 :(得分:0)

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

答案 35 :(得分:0)

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

答案 36 :(得分:0)

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

答案 37 :(得分:0)

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

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

答案 38 :(得分:0)

使用 Xcode 6.4 Swift 1.2 iOS 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

答案 39 :(得分:-1)

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

"string".length // 6

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

答案 40 :(得分:-1)

如果您正在寻找一种更简洁的方法来获取字符串结帐的长度,这个库中包含Swift内置类http://www.dollarswift.org/#length

的一堆扩展

使用此库,您可以"Some Str".length