Làm thế nào để bạn có được chiều dài của một String
? Ví dụ: tôi có một biến được định nghĩa như:
var test1: String = "Scott"
Tuy nhiên, tôi dường như không thể tìm thấy một phương thức độ dài trên chuỗi.
Làm thế nào để bạn có được chiều dài của một String
? Ví dụ: tôi có một biến được định nghĩa như:
var test1: String = "Scott"
Tuy nhiên, tôi dường như không thể tìm thấy một phương thức độ dài trên chuỗi.
Câu trả lời:
Kể từ Swift 4+
Nó chỉ:
test1.count
vì lý do.
(Cảm ơn Martin R)
Kể từ Swift 2:
Với Swift 2, Apple đã thay đổi các chức năng toàn cầu thành các tiện ích mở rộng giao thức, tiện ích mở rộng phù hợp với bất kỳ loại nào phù hợp với giao thức. Do đó, cú pháp mới là:
test1.characters.count
(Cảm ơn JohnDifool vì đã ngẩng cao đầu)
Kể từ Swift 1
Sử dụng phương thức đếm ký tự:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
ngay từ Hướng dẫn Apple Swift
(lưu ý, đối với các phiên bản Swift sớm hơn 1.2, điều này sẽ countElements(unusualMenagerie)
thay thế)
cho biến của bạn, nó sẽ là
length = count(test1) // was countElements in earlier versions of Swift
Hoặc bạn có thể sử dụng test1.utf16count
string.count
.
Đối với Swift 2.0 và 3.0, hãy sử dụng test1.characters.count
. Nhưng, có một vài điều bạn nên biết. Vì vậy, đọc tiếp.
Trước Swift 2.0, count
là một chức năng toàn cầu. Kể từ Swift 2.0, nó có thể được gọi là một hàm thành viên.
test1.characters.count
Nó sẽ trả về số lượng ký tự Unicode thực tế trong một String
, do đó, đây là cách thay thế chính xác nhất theo nghĩa, nếu bạn in chuỗi và đếm các ký tự bằng tay, bạn sẽ nhận được kết quả tương tự.
Tuy nhiên, do cách thức Strings
được triển khai trong Swift, các nhân vật không phải lúc nào cũng chiếm cùng một bộ nhớ, vì vậy hãy lưu ý rằng điều này hoạt động hoàn toàn khác so với các phương thức đếm ký tự thông thường trong các ngôn ngữ khác.
Ví dụ, bạn cũng có thể sử dụng test1.utf16.count
Nhưng, như đã nêu dưới đây, giá trị trả về là không đảm bảo được tương tự như gọi count
trên characters
.
Từ tài liệu tham khảo ngôn ngữ:
Các cụm grapheme mở rộng có thể bao gồm một hoặc nhiều vô hướng Unicode. Điều này có nghĩa là các nhân vật khác nhau, và các cách thể hiện khác nhau của cùng một nhân vật có thể yêu cầu số lượng bộ nhớ khác nhau để lưu trữ. Do đó, các ký tự trong Swift không chiếm cùng một lượng bộ nhớ trong biểu diễn của một chuỗi. Kết quả là, số lượng ký tự trong một chuỗi không thể được tính mà không lặp qua chuỗi để xác định ranh giới cụm grapheme mở rộng của nó. Nếu bạn đang làm việc với các giá trị chuỗi đặc biệt dài, hãy lưu ý rằng thuộc tính ký tự phải lặp qua các vô hướng Unicode trong toàn bộ chuỗi để xác định các ký tự cho chuỗi đó.
Số lượng ký tự được trả về bởi thuộc tính ký tự không phải lúc nào cũng giống với thuộc tính độ dài của một NSString có chứa các ký tự giống nhau. Độ dài của một NSString dựa trên số đơn vị mã 16 bit trong biểu diễn UTF-16 của chuỗi chứ không phải số cụm grapheme mở rộng Unicode trong chuỗi.
Một ví dụ minh họa hoàn hảo tình huống được mô tả ở trên là kiểm tra độ dài của chuỗi chứa một ký tự biểu tượng cảm xúc, như được chỉ ra bởi n00neimp0rtant trong các bình luận.
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) có được số lượng ký tự chính xác trong Chuỗi. Nó có thể khác với những gì bạn nhận được khi gọi [str length]
trong Objective-C, bởi vì length
phương thức giả định tất cả các ký tự trong chuỗi bao gồm các đơn vị mã 16 bit, trong khi countElements()
có được số lượng ký tự Unicode thực tế. Tuy nhiên, hầu hết thời gian tất cả các lựa chọn thay thế ở trên sẽ trả về cùng một kết quả, đặc biệt nếu bạn đang làm việc với các ký tự phổ biến bằng tiếng Anh.
Cập nhật Swift 1.2: Không còn là số đếm để đếm kích thước của bộ sưu tập. Chỉ cần sử dụng chức năng đếm thay thế: đếm ("Swift")
Swift 2.0, 3.0 và 3.1:
hãy để strLạng = string.char character.count
Swift 4.2 (4.0 trở đi): [Tài liệu Apple - Chuỗi]
hãy để strLạng = string.count
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)
Swift 4
"string".count
;)
Swift 3
extension String {
var length: Int {
return self.characters.count
}
}
sử dụng
"string".length
//: 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))
Nếu bạn chỉ đang cố gắng xem liệu một chuỗi có trống hay không (kiểm tra độ dài bằng 0), Swift cung cấp một phương thức kiểm tra boolean đơn giản trên String
myString.isEmpty
Mặt khác của đồng tiền này là mọi người hỏi trong ObjectiveC làm thế nào để hỏi xem một chuỗi có trống không trong đó câu trả lời là kiểm tra độ dài 0:
tl; dr Nếu bạn muốn độ dài của một loại Chuỗi theo số lượng ký tự có thể đọc được của con người, hãy sử dụng CountElements () . Nếu bạn muốn biết độ dài về số lượng cụm grapheme mở rộng , hãy sử dụng end Index . Đọc để biết chi tiết.
Kiểu Chuỗi được triển khai dưới dạng tập hợp có thứ tự (nghĩa là chuỗi) các ký tự Unicode và nó tuân theo giao thức CollectionType , phù hợp với giao thức _CollectionType , là loại đầu vào được mong đợi bởi CountElements () . Do đó, CountElements () có thể được gọi, chuyển một kiểu Chuỗi và nó sẽ trả về số lượng ký tự.
Tuy nhiên, trong phù hợp với CollectionType , mà trong chiếu theo lần lượt _CollectionType , Chuỗi cũng thực hiện các startIndex và endIndex tính tính, mà thực sự đại diện cho vị trí của chỉ số trước các cụm ký tự đầu tiên, và vị trí của các chỉ số sau cụm ký tự cuối cùng, tương ứng . Vì vậy, trong chuỗi "ABC", vị trí của chỉ số trước A là 0 và sau C là 3. Do đó, end Index = 3, cũng là độ dài của chuỗi.
Vì vậy, end Index có thể được sử dụng để lấy độ dài của bất kỳ loại Chuỗi nào, phải không?
Chà, không phải lúc nào ... Các ký tự Unicode thực sự là các cụm grapheme mở rộng , là các chuỗi của một hoặc nhiều vô hướng Unicode được kết hợp để tạo ra một ký tự có thể đọc được bằng con người.
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
CircledStar là một ký tự đơn được tạo thành từ U + 2606 (một ngôi sao trắng) và U + 20DD (một vòng tròn bao quanh kết hợp). Hãy tạo một chuỗi từ circledStar và so sánh kết quả của countElements () và endIndex .
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
Đây là một cái gì đó ngắn hơn và tự nhiên hơn so với sử dụng chức năng toàn cầu:
aString.utf16count
Tôi không biết nếu nó có sẵn trong phiên bản beta 1. Nhưng nó chắc chắn có trong phiên bản beta 2.
Đã cập nhật cho Xcode 6 beta 4, thay đổi phương thức utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Hoặc là
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
sẽ sai
Kể từ Swift 1.2 utf16Count
đã bị xóa. Bây giờ bạn nên sử dụng count()
hàm toàn cục và chuyển giao dạng UTF16 của chuỗi. Ví dụ dưới đây ...
let string = "Some string"
count(string.utf16)
Đối với Xcode 7.3 và Swift 2.2.
let str = "🐶"
Nếu bạn muốn số lượng nhân vật trực quan:
str.characters.count
Nếu bạn muốn "đơn vị mã 16 bit trong biểu diễn UTF-16 của chuỗi":
str.utf16.count
Hầu hết thời gian, 1 là những gì bạn cần.
Khi nào bạn cần 2 ? Tôi đã tìm thấy một trường hợp sử dụng cho 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
Nếu bạn sử dụng 1 , kết quả không chính xác:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶
Trong swift4 tôi đã luôn sử dụng string.count
cho đến ngày hôm nay tôi đã thấy rằng
string.endIndex.encodedOffset
là sự thay thế tốt hơn bởi vì nó nhanh hơn - cho chuỗi 50 000 ký tự nhanh hơn khoảng 6 lần .count
. Việc .count
phụ thuộc vào độ dài chuỗi nhưng .endIndex.encodedOffset
không.
Nhưng có một KHÔNG. Nó không tốt cho chuỗi với biểu tượng cảm xúc, nó sẽ cho kết quả sai, vì vậy chỉ .count
có chính xác.
Trong Swift 4 : Nếu chuỗi không chứa các ký tự unicode thì hãy sử dụng như sau
let str : String = "abcd"
let count = str.count // output 4
Nếu chuỗi chứa ký tự unicode thì sử dụng như sau:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
utf8.count
? Điều đó không đưa ra số lượng nhân vật. Nó đưa ra số byte cần thiết cho mã hóa UTF-8 của chuỗi.
Trong Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
Tôi nghĩ rằng những bộ não sẽ thay đổi điều này trên mỗi phiên bản nhỏ.
Nhận giá trị chuỗi từ textview hoặc textfield của bạn:
let textlengthstring = (yourtextview?.text)! as String
Tìm số lượng các ký tự trong chuỗi:
let numberOfChars = textlength.characters.count
Đây là những gì tôi đã làm
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
return true
trường hợp nào?). Bạn có thể vui lòng kiểm tra lại và, trong trường hợp, chỉnh sửa câu trả lời của bạn? Cảm ơn bạn!
Cập nhật Swift 4 so với swift 3
Swift 4 loại bỏ sự cần thiết của một mảng ký tự trên Chuỗi. Điều này có nghĩa là bạn có thể gọi trực tiếp count
trên một chuỗi mà không cần lấy mảng ký tự trước.
"hello".count // 5
Trong khi ở swift 3, bạn sẽ phải lấy mảng ký tự và sau đó đếm phần tử trong mảng đó. Lưu ý rằng phương thức sau đây vẫn có sẵn trong swift 4.0 vì bạn vẫn có thể gọi characters
để truy cập mảng ký tự của chuỗi đã cho
"hello".characters.count // 5
Swift 4.0 cũng áp dụng Unicode 9 và giờ đây nó có thể diễn giải các cụm grapheme. Ví dụ: tính vào biểu tượng cảm xúc sẽ cung cấp cho bạn 1 trong khi ở swift 3.0, bạn có thể nhận được số lượng lớn hơn 1.
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4
Bạn có thể nhận được độ dài chỉ bằng cách viết một phần mở rộng:
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
}
}
test1.characters.count
sẽ giúp bạn có được số lượng chữ cái / số vv trong chuỗi của bạn.
Ví dụ:
test1 = "StackOverflow"
print(test1.characters.count)
( in " 13 ")
Apple làm cho nó khác với ngôn ngữ chính khác. Cách hiện tại là gọi:
test1.char character.count
Tuy nhiên, để cẩn thận, khi bạn nói độ dài, bạn có nghĩa là số lượng ký tự không phải là số byte, bởi vì hai ký tự đó có thể khác nhau khi bạn sử dụng các ký tự không phải mã ascii.
Ví dụ;
"你好啊hi".characters.count
sẽ cung cấp cho bạn 5 nhưng đây không phải là số byte. Để có được số byte thực sự, bạn cần phải làm "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Điều này sẽ cung cấp cho bạn 11.
Ngay bây giờ (trong Swift 2.3) nếu bạn sử dụng:
myString.characters.count
phương thức sẽ trả về loại "Khoảng cách", nếu bạn cần phương thức trả về một Số nguyên, bạn nên nhập kiểu như vậy:
var count = myString.characters.count as Int
Distance
số String.CharacterView
là Int
, không nên có nhu cầu về dàn diễn viên này.