คุณจะได้ความยาวของ 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
แต่ตามที่ระบุไว้ด้านล่างค่าที่ส่งกลับไม่รับประกันว่าจะเป็นเช่นเดียวกับที่ของการโทรบนcountcharacters
จากการอ้างอิงภาษา:
กลุ่มของกราฟแบบขยายสามารถประกอบด้วยสเกลาร์ 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ควรจะมีความจำเป็นในการหล่อนี้