คุณจะได้ความยาวของ a String
อย่างไร ตัวอย่างเช่นฉันมีตัวแปรที่กำหนดเช่น:
var test1: String = "Scott"
อย่างไรก็ตามฉันไม่สามารถหาวิธีความยาวบนสตริงได้
คุณจะได้ความยาวของ a String
อย่างไร ตัวอย่างเช่นฉันมีตัวแปรที่กำหนดเช่น:
var test1: String = "Scott"
อย่างไรก็ตามฉันไม่สามารถหาวิธีความยาวบนสตริงได้
คำตอบ:
ตั้งแต่ 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 Guide
(หมายเหตุสำหรับ Swift เวอร์ชันก่อนหน้า 1.2 จะเป็นสิ่งนี้countElements(unusualMenagerie)
แทน)
สำหรับตัวแปรของคุณมันจะเป็น
length = count(test1) // was countElements in earlier versions of Swift
หรือคุณสามารถใช้ test1.utf16count
string.count
ก็จะเป็น
สำหรับสวิฟท์ 2.0 และ 3.0test1.characters.count
การใช้งาน แต่มีบางสิ่งที่คุณควรรู้ ดังนั้นอ่านต่อ
ก่อน Swift 2.0 count
เป็นฟังก์ชั่นระดับโลก ในฐานะของ Swift 2.0 มันสามารถเรียกว่าเป็นฟังก์ชั่นสมาชิก
test1.characters.count
มันจะคืนค่าจำนวนอักขระ Unicode ที่แท้จริงใน a String
ดังนั้นจึงเป็นทางเลือกที่ถูกต้องที่สุดในแง่ที่ว่าถ้าคุณพิมพ์สตริงและนับจำนวนตัวอักษรด้วยมือคุณจะได้ผลลัพธ์เดียวกัน
อย่างไรก็ตามเนื่องจากวิธีStrings
การใช้งานใน Swift ตัวละครจึงไม่ได้ใช้หน่วยความจำในปริมาณเท่ากันเสมอดังนั้นโปรดทราบว่าสิ่งนี้จะทำงานแตกต่างจากวิธีการนับจำนวนตัวอักษรปกติในภาษาอื่น
ตัวอย่างเช่นคุณยังสามารถใช้ test1.utf16.count
แต่ตามที่ระบุไว้ด้านล่างค่าที่ส่งกลับไม่รับประกันว่าจะเป็นเช่นเดียวกับที่ของการโทรบนcount
characters
จากการอ้างอิงภาษา:
กลุ่มของกราฟแบบขยายสามารถประกอบด้วยสเกลาร์ Unicode ตั้งแต่หนึ่งตัวขึ้นไป ซึ่งหมายความว่าอักขระที่แตกต่างกันและการนำเสนอที่แตกต่างกันของอักขระเดียวกันนั้นอาจต้องการหน่วยความจำในการจัดเก็บที่แตกต่างกัน ด้วยเหตุนี้อักขระใน Swift จึงไม่ใช้หน่วยความจำในปริมาณเท่ากันภายในการแทนค่าของสตริง ด้วยเหตุนี้จำนวนอักขระในสตริงจึงไม่สามารถคำนวณได้โดยไม่ต้องวนซ้ำผ่านสตริงเพื่อกำหนดขอบเขตคลัสเตอร์คลัสเตอร์กราฟเพิ่มเติม หากคุณกำลังทำงานกับค่าสตริงที่ยาวเป็นพิเศษโปรดทราบว่าคุณสมบัติอักขระต้องวนซ้ำสเกล Unicode ในสตริงทั้งหมดเพื่อกำหนดอักขระสำหรับสตริงนั้น
จำนวนอักขระที่ส่งคืนโดยคุณสมบัติอักขระไม่เหมือนกับคุณสมบัติความยาวของ NSString ที่มีอักขระเหมือนกันเสมอไป ความยาวของ NSString ขึ้นอยู่กับจำนวนของหน่วยรหัส 16 บิตภายในการแสดง UTF-16 ของสตริงและไม่ใช่จำนวนของ Unicode ที่ขยายกราฟกลุ่มภายในสตริง
ตัวอย่างที่แสดงสถานการณ์ที่อธิบายไว้ข้างต้นได้อย่างสมบูรณ์คือการตรวจสอบความยาวของสตริงที่มีอักขระอิโมจิตัวเดียวตามที่ระบุโดยn00neimp0rtantในความคิดเห็น
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) รับจำนวนอักขระที่แน่นอนใน String อาจแตกต่างจากสิ่งที่คุณจะได้รับจากการโทร[str length]
ใน Objective-C เนื่องจากlength
วิธีการสมมติว่าตัวละครทุกตัวในสตริงนั้นประกอบด้วยหน่วยรหัส 16 บิตในขณะที่countElements()
รับจำนวน Unicode ตัวจริง อย่างไรก็ตามส่วนใหญ่ตัวเลือกทั้งหมดข้างต้นจะส่งคืนผลลัพธ์เดียวกันโดยเฉพาะอย่างยิ่งหากคุณกำลังทำงานกับอักขระทั่วไปภาษาอังกฤษ
อัพเดต Swift 1.2: ไม่มีการนับเสริมสำหรับการนับขนาดของคอลเลกชัน เพียงใช้ฟังก์ชั่นการนับแทน: count ("Swift")
Swift 2.0, 3.0 และ 3.1:
ให้ strLength = string.characters.count
Swift 4.2 (4.0 เป็นต้นไป): [Apple Documentation - Strings]
ให้ strLength = string.count
สวิฟท์ 1.1
extension String {
var length: Int { return countElements(self) } //
}
สวิฟท์ 1.2
extension String {
var length: Int { return count(self) } //
}
Swift 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)
สวิฟต์ 4
"string".count
;)
สวิฟท์ 3
extension String {
var length: Int {
return self.characters.count
}
}
การใช้
"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))
หากคุณเพียงแค่พยายามดูว่าสตริงว่างเปล่าหรือไม่ (ตรวจสอบความยาวเป็น 0) Swift นำเสนอวิธีทดสอบบูลีนแบบง่าย ๆ String
myString.isEmpty
อีกด้านหนึ่งของเหรียญนี้คือผู้ที่ถามใน ObjectiveC จะถามได้อย่างไรว่าสตริงว่างเปล่าหรือไม่ซึ่งคำตอบคือการตรวจสอบความยาว 0:
TL; DRหากคุณต้องการความยาวของชนิดสตริงในแง่ของจำนวนของตัวละครมนุษย์สามารถอ่านได้ที่ใช้countElements () หากคุณต้องการที่จะรู้ว่ามีความยาวในแง่ของจำนวนของกลุ่มอักษรขยายการใช้endIndex อ่านต่อเพื่อดูรายละเอียด
Stringประเภทจะดำเนินการเป็นคอลเลกชันที่สั่งซื้อ (เช่นลำดับ) ของตัวอักษร Unicode และมันสอดคล้องกับCollectionTypeโปรโตคอลซึ่งสอดคล้องกับ_CollectionTypeโปรโตคอลซึ่งเป็นประเภทการป้อนข้อมูลที่คาดหวังโดยcountElements () ดังนั้นcountElements ()สามารถเรียกใช้ผ่านประเภทสตริงและจะส่งกลับจำนวนตัวอักษร
อย่างไรก็ตามในสอดคล้องกับCollectionTypeซึ่งสอดหันไป_CollectionType , Stringยังดำเนิน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 (วงกลมล้อมรอบที่รวมกัน) ลองสร้างStringจากcircledStarและเปรียบเทียบผลของการcountElements ()และendIndex
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
ใน Swift 2.0 count
ไม่ทำงานอีกต่อไป คุณสามารถใช้สิ่งนี้แทน:
var testString = "Scott"
var length = testString.characters.count
นี่คือบางสิ่งที่สั้นกว่าและดูเป็นธรรมชาติมากกว่าการใช้ฟังก์ชันสากล:
aString.utf16count
ฉันไม่รู้ว่ามันมีให้ในรุ่นเบต้า 1 หรือไม่ แต่มันมีอยู่ในเบต้า 2 แน่นอน
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"
อัปเดตสำหรับ Xcode 6 เบต้า 4 เปลี่ยนวิธี utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
หรือ
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
จะผิด
สำหรับ Xcode 7.3 และ Swift 2.2
let str = "🐶"
หากคุณต้องการจำนวนตัวอักษรภาพ:
str.characters.count
หากคุณต้องการ "หน่วยรหัส 16 บิตภายในการแสดง UTF-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🐶🐶🐶
ใน Swift 2.x ต่อไปนี้เป็นวิธีการค้นหาความยาวของสตริง
let findLength = "This is a string of text"
findLength.characters.count
ผลตอบแทน 24
Swift 2.0: รับจำนวน: yourString.text.characters.count
ตัวอย่างที่สนุกของวิธีนี้มีประโยชน์คือการแสดงการนับถอยหลังตัวอักษรจากตัวเลข (เช่น 150) ใน UITextView:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
ใน swift4 ฉันมักจะใช้string.count
จนถึงทุกวันนี้ฉันพบว่า
string.endIndex.encodedOffset
คือการเปลี่ยนตัวผู้เล่นที่ดีกว่าเพราะมันจะเร็ว - 50 000 ตัวอักษรสตริงประมาณ 6 .count
เวลาเร็วกว่า .count
ขึ้นอยู่กับความยาวสาย แต่.endIndex.encodedOffset
ไม่ได้
แต่ไม่มีใคร มันไม่ดีสำหรับสายที่มีอิโมจิมันจะให้ผลที่ผิดดังนั้น.count
ถูกต้องเท่านั้น
ใน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
utf8.count
? นั่นไม่ได้นับจำนวนตัวอักษร มันให้จำนวนไบต์ที่จำเป็นสำหรับการเข้ารหัส UTF-8 ของสตริง
ใน Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
ฉันคิดว่า brainiacs จะเปลี่ยนสิ่งนี้ในทุกเวอร์ชั่นย่อย
รับค่าสตริงจาก textview หรือ textfield ของคุณ:
let textlengthstring = (yourtextview?.text)! as String
ค้นหาจำนวนตัวอักษรในสตริง:
let numberOfChars = textlength.characters.count
นี่คือสิ่งที่ฉันทำ
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
return true
กรณีเช่นกัน?) คุณช่วยกรุณาตรวจสอบอีกครั้งและในกรณีที่แก้ไขคำตอบของคุณ? ขอบคุณ!
อัพเดต 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 ในขณะที่รวดเร็ว 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
สวิฟต์ 4
let str = "Your name"
str.count
ข้อควรจำ: ช่องว่างถูกนับในจำนวนด้วย
คุณสามารถรับความยาวได้ง่ายๆโดยการเขียนส่วนขยาย:
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
}
}
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
ค่านี้นับจำนวนตัวอักษรใน Normal Swift String
countElements((newString as String))
ค่านี้นับจำนวนอักขระใน NSString
วิธีที่ดีที่สุดในการนับ String ใน Swift คือ:
var str = "Hello World"
var length = count(str.utf16)
String และ NSString เป็นบริดจ์ที่ไม่มีค่าผ่านทางดังนั้นคุณสามารถใช้วิธีการทั้งหมดที่มีให้กับ NSString ด้วยสตริงที่รวดเร็ว
let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
test1.characters.count
คุณจะได้รับจำนวนตัวอักษร / ตัวเลข ฯลฯ ในสตริงของคุณ
อดีต:
test1 = "StackOverflow"
print(test1.characters.count)
( พิมพ์ " 13 ")
Apple ทำให้มันแตกต่างจากภาษาหลักอื่น ๆ วิธีปัจจุบันคือการโทร:
test1.characters.count
อย่างไรก็ตามเพื่อให้ระมัดระวังเมื่อคุณพูดความยาวคุณหมายถึงจำนวนตัวอักษรไม่ใช่จำนวนไบต์เนื่องจากทั้งสองอาจแตกต่างกันเมื่อคุณใช้อักขระที่ไม่ใช่ ASCII
ตัวอย่างเช่น;
"你好啊hi".characters.count
จะให้ 5 แต่ไม่นับจำนวนไบต์ "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
เพื่อให้ได้จำนวนที่แท้จริงของไบต์ที่คุณต้องทำ สิ่งนี้จะทำให้คุณ 11
ตอนนี้ (ใน Swift 2.3) ถ้าคุณใช้:
myString.characters.count
วิธีนี้จะคืนค่าเป็น "ระยะทาง" ถ้าคุณต้องการวิธีคืนค่าจำนวนเต็มคุณควรพิมพ์ตัวละครแบบดังนี้:
var count = myString.characters.count as Int
Distance
ของString.CharacterView
คือ Int
ควรจะมีความจำเป็นในการหล่อนี้