关于swift:获取String的长度

Get the length of a String

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

1
var test1: String ="Scott"

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


斯威夫特4

只是:

1
test1.count

理由。

(感谢马丁R)

斯威夫特2:

有了Swift2,苹果将全球功能改为协议扩展,即与任何符合协议的类型相匹配的扩展。因此,新的语法是:

1
test1.characters.count

(多亏了约翰迪愚的支持)

斯威夫特1

使用计数字符方法:

1
2
3
let unusualMenagerie ="Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints"unusualMenagerie has 40 characters"

就在苹果环球旅行指南的右边

(注:对于早于1.2的swift版本,应改为countElements(unusualMenagerie))

对于您的变量,它将是

1
length = count(test1) // was countElements in earlier versions of Swift

或者可以使用test1.utf16count


TLDR:

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

用swift计数字符

在Swift2.0之前,count是一个全球功能。从swift 2.0开始,它可以作为成员函数调用。

1
test1.characters.count

它将返回一个String中的实际Unicode字符数,因此它是最正确的选择,从这个意义上说,如果您手工打印字符串和计数字符,您将得到相同的结果。

但是,由于Strings是用swift实现的,字符并不总是占用相同的内存量,因此请注意,这与其他语言中常见的字符计数方法有很大的不同。

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

但是,如下文所述,返回值不保证与调用characterscount相同。

从语言参考:

Extended grapheme clusters can be composed of one or more Unicode
scalars. This means that different characters—and different
representations of the same character—can require different amounts of
memory to store. Because of this, characters in Swift do not each take
up the same amount of memory within a string’s representation. As a
result, the number of characters in a string cannot be calculated
without iterating through the string to determine its extended
grapheme cluster boundaries. If you are working with particularly long
string values, be aware that the characters property must iterate over
the Unicode scalars in the entire string in order to determine the
characters for that string.

The count of the characters returned by the characters property is not
always the same as the length property of an NSString that contains
the same characters. The length of an NSString is based on the number
of 16-bit code units within the string’s UTF-16 representation and not
the number of Unicode extended grapheme clusters within the string.

如注释中的n0neimp0rtant所指出的,一个完美地说明上述情况的示例是检查包含单个emoji字符的字符串的长度。

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


swift 1.2更新:不再有用于计算集合大小的countelements。只需使用count函数作为替换:count("swift")

swift 2.0、3.0和3.1:

let strLength = string.characters.count

Swift 4.2(4.0以后):[苹果文档-字符串]

let strLength = string.count


斯威夫特1.1

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

斯威夫特1.2

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

斯威夫特2

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

斯威夫特4.2

1
2
3
extension String {
    var length: Int { return self.count }          
}
1
2
let str ="Hello"
let count = str.length    // returns 5 (Int)


斯威夫特4

"string".count

;)

斯威夫特3

1
2
3
4
5
extension String {
    var length: Int {
        return self.characters.count
    }
}

使用

"string".length


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

1
myString.isEmpty

这枚硬币的另一面是人们客观性地询问如何询问一个字符串是否是空的,答案在哪里检查长度为0:

nsstring为空


tl;dr如果您希望字符串类型的长度与人类可读字符的数量有关,请使用countelements()。如果您想知道扩展图形簇的长度,请使用endindex。请继续阅读以了解详细信息。

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

但是,在符合collectiontype(反过来又符合collectiontype)的情况下,string还实现startindex和endindex计算属性,这些属性实际上分别表示索引在第一个字符集群之前的位置和索引在最后一个字符集群之后的位置。所以,在字符串"abc"中,索引在a之前的位置是0,在c之后的位置是3。因此,endindex=3,这也是字符串的长度。

那么,endindex可以用来获取任何字符串类型的长度,对吗?

好吧,并不总是……Unicode字符实际上是扩展的图形簇,它是一个或多个Unicode标量组合的序列,以创建一个人类可读的字符。

1
let circledStar: Character ="\u{2606}\u{20DD}" // ☆?

圆圈星是由U+2606(白星)和U+20dd(组合包围圈)组成的单个字符。让我们从CircledStar创建一个字符串,并比较CountElements()和EndIndex的结果。

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

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

1
aString.utf16count

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


在Swift2.0中,count不再有效。您可以使用它:

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

更新Xcode6 beta 4,更改方法utf16count->utf16count

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

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


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

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


你可以试试这个

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


对于Xcode 7.3和Swift 2.2。

1
let str ="??"

1)如果需要可视字符数:

1
str.characters.count // 1

2)如果您需要16-bit code units within the string’s UTF-16 representation

1
str.utf16.count // 2

大多数情况下,1)是你需要的。

你什么时候需要2个?我找到了一个2)的用例:

1
2
3
4
5
6
7
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),则结果不正确:

1
2
3
4
let result = regex.stringByReplacingMatchesInString(str,
    options: NSMatchingOptions.WithTransparentBounds,
    range: NSMakeRange(0, str.characters.count), withTemplate:"dog")
print(result) // dogdogdog??????

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

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

返回24


斯威夫特2:计数:yourString.text.characters.count

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

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

斯威夫特5

1
2
3
4
5
6
7
8
9
10
11
12
13
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"

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

1
string.endIndex.encodedOffset

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

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


在SWIFT 4中:如果字符串不包含Unicode字符,请使用以下内容

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

如果字符串包含Unicode字符,请使用以下字符:

1
2
3
let spain ="Espa?a"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
    }
}

斯威夫特4

1
2
3
let str = "Your name"

str.count

记住:空格也算在数字中


在XCOD6.1.1

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

我认为每个次要版本的大脑都会改变这个。


从textView或textfield获取字符串值:

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

查找字符串中的字符数:

1
let numberOfChars = textlength.characters.count

这就是我最后所做的

1
2
3
4
5
6
7
let replacementTextAsDecimal = Double(string)

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


我的2美分是3/4雨燕

如果需要有条件地编译

1
2
3
4
5
    #if swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif


如果您使用:

1
myString.characters.count

该方法将返回一个"距离"类型,如果需要该方法返回一个整数,则应按如下方式进行类型转换:

1
var count = myString.characters.count as Int


string和nsstring是免费的网桥,因此您可以使用具有swift字符串的nsstring可用的所有方法。

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

与Swift 3相比,Swift 4更新

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

1
"hello".count                  // 5

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

1
"hello".characters.count       // 5

Swift4.0也采用了Unicode9,现在它可以解释图形集群。例如,在Swift 3.0中,计数emoji将给您1,而计数可能大于1。

1
2
"????".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"???????????".count // Swift 4.0 prints 1, Swift 3.0 prints 4

苹果使它不同于其他主要语言。目前的方法是:

测试1.characters.count

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

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


1
test1.characters.count

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

前任:

1
2
3
test1 ="StackOverflow"

print(test1.characters.count)

(打印13)


用swift计算字符串的最佳方法是:

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


1
2
3
4
var str ="Hello, playground"
var newString = str as NSString    

countElements(str)

这将计算常规swift字符串中的字符数

1
countElements((newString as String))

这将统计nsstring中的字符数


在Swift 4.1和Xcode 9.4.1中

在目标C和Swift中获取长度是不同的。在obj-c中我们使用length属性,但在swift中我们使用count属性

例子:

1
2
3
4
5
6
7
//In Swift
let stringLenght ="This is my String"
print(stringLenght.count)

//In Objective c
NSString * stringLenght = @"This is my String";
NSLog(@"%lu", stringLenght.length);

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


在Swift 4.2和Xcode 10.1中

在swift中,字符串可以被视为单个字符的数组。所以字符串中的每个字符都像数组中的一个元素。要获取字符串的长度,请使用YoursTringName.Count属性。

在Swift

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

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

如果目标C

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


通用Swift 4和3解决方案

1
2
3
4
5
6
7
8
9
10
/**
 * 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)
    }
}

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


使用Xcode 6.4、Swift 1.2和iOS 8.4:

1
2
3
4
5
6
7
8
9
    //: 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

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

1
2
3
4
5
extension NSString {
    func charLength() -> Int {
        return count(self as String)
    }
}

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

"string".length // 6

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


如果您正在寻找一种更清晰的方法来获取字符串的长度,那么这个库有许多对swift内置类的扩展http://www.dollarswift.org/length

使用这个库,您只需执行EDOCX1[0]