swift - الحصول على طول سلسلة




string (25)

سويفت 4.0

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"

كيف يمكنك الحصول على طول String ؟ على سبيل المثال ، لدي متغير محدد مثل:

var test1: String = "Scott"

ومع ذلك ، لا يبدو لي أن أجد طريقة طول على السلسلة.


بلدي سنتا للسريع 3/4

إذا كنت بحاجة لتجميع شرطي

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

TLDR:

بالنسبة لـ Swift 2.0 و 3.0 ، استخدم test1.characters.count . ولكن ، هناك بعض الأشياء التي يجب عليك معرفتها. لذا ، اقرأ.

عد الشخصيات في سويفت

قبل Swift 2.0 ، كانت count وظيفة عالمية. اعتبارًا من Swift 2.0 ، يمكن تسميته كوظيفة عضو.

test1.characters.count

ستقوم بإرجاع العدد الفعلي لأحرف Unicode في String ، لذلك فهو البديل الأكثر صحة بمعنى أنه إذا قمت بطباعة السلسلة وعدد الأحرف يدوياً ، فستحصل على نفس النتيجة.

ومع ذلك ، وبسبب الطريقة التي يتم بها تنفيذ Strings في Swift ، لا تأخذ الأحرف دائمًا نفس مقدار الذاكرة ، لذا يجب الانتباه إلى أن هذا السلوك يختلف تمامًا عن الطرق المعتادة لعدد الأحرف في اللغات الأخرى.

على سبيل المثال ، يمكنك أيضًا استخدام test1.utf16.count

ولكن ، كما هو موضح أدناه ، لا يتم ضمان القيمة التي تم إرجاعها لتكون نفس قيمة استدعاء count .

من مرجع اللغة:

يمكن أن تتكون مجموعات حروف الجمل الموسعة من واحد أو أكثر من scalars يونيكود. هذا يعني أن الأحرف المختلفة - والتمثيلات المختلفة لنفس الحرف - يمكن أن تتطلب كميات مختلفة من الذاكرة لتخزينها. وبسبب هذا ، لا تأخذ الأحرف في Swift كل مقدار الذاكرة نفسه داخل تمثيل السلسلة. وكنتيجة لذلك ، لا يمكن حساب عدد الأحرف في سلسلة دون التكرار خلال السلسلة لتحديد حدود الكتلة الجرفية الخاصة به الموسعة. إذا كنت تعمل بقيم سلسلة طويلة بشكل خاص ، فكن على دراية بأن خاصية الأحرف يجب أن تقوم بالتكرار فوق سلسلة الحروف Unicode في السلسلة بأكملها لتحديد حروف هذه السلسلة.

لا يكون عدد الأحرف التي يتم إرجاعها بواسطة خاصية الأحرف هو نفس خاصية الطول الخاصة بـ NSString التي تحتوي على نفس الأحرف. يعتمد طول NSString على عدد وحدات التعليمة البرمجية ذات 16 بتة داخل تمثيل UTF-16 للسلسلة وليس عدد تجمعات Grapheme الموسعة داخل السلسلة.

من الأمثلة التي توضح بشكل مثالي الحالة الموضحة أعلاه هي التحقق من طول سلسلة تحتوي على حرف emoji فردي ، كما هو n00neimp0rtant إليه بواسطة n00neimp0rtant في التعليقات.

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

في 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

في Xcode 6.1.1

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

أعتقد أن brainiacs سيغير هذا على كل نسخة ثانوية.


الحصول على قيمة سلسلة من عرض النص أو حقل النص:

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

ابحث عن عدد الأحرف في السلسلة:

let numberOfChars = textlength.characters.count

اعتبارا من سويفت 1.2 تم حذف utf16Count . يجب عليك الآن استخدام الدالة count() العمومية وتمرير عرض UTF16 للسلسلة. المثال أدناه ...

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

يمكنك أن تجرب مثل هذا

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

test1.characters.count

سوف تحصل على عدد من الحروف / الأرقام وغيرها في السلسلة الخاصة بك.

مثلا:

test1 = ""

print(test1.characters.count)

( يطبع " 13 ")


تحديث Swift 1.2: لم يعد هناك عدد مخصص لحساب عدد المجموعات. مجرد استخدام وظيفة العد كبديل: العد ("سويفت")

Swift 2.0 و 3.0 و 3.1:

اسمحوا strLength = string.characters.count

Swift 4.0: [Apple Apple Documentation - Strings]

دعونا strLength = string.count


أفضل طريقة لحساب سلسلة في Swift هي:

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

let str = "Hello"
let count = str.length    // returns 5 (Int)

extension String {
    var length: Int { return countElements(self) }  // Swift 1.1
}
extension String {
    var length: Int { return count(self)         }  // Swift 1.2
}
extension String {
    var length: Int { return characters.count    }  // Swift 2.0
}

إذا كنت تحاول فقط معرفة ما إذا كانت سلسلة فارغة أم لا (التحقق من طول 0) ، يقدم Swift طريقة اختبار منطقية بسيطة على String

myString.isEmpty

الجانب الآخر من هذه العملة هو الأشخاص الذين يسألون في ObjectiveC كيف يسألون ما إذا كان الخيط فارغًا حيث كان الجواب للتحقق من طول 0:

NSString فارغ


tl؛ dr إذا كنت تريد طول نوع String من حيث عدد الأحرف التي يمكن قراءتها ، فاستخدم countElements () . إذا كنت تريد معرفة الطول من حيث عدد مجموعات حروف الجمل الموسعة ، فاستخدم endIndex . قراءة لمزيد من التفاصيل.

يتم تنفيذ نوع String كمجموعة مرتبة (أي تسلسل) من أحرف Unicode ، ويتوافق مع بروتوكول CollectionType ، الذي يتوافق مع _CollectionType protocol ، وهو نوع الإدخال المتوقع من countElements () . لذلك ، يمكن استدعاء countElements () ، تمرير نوع String ، وسيعود عدد الأحرف.

ومع ذلك ، بالتوافق مع CollectionType ، والذي يتوافق بدوره مع _CollectionType ، فإن String يقوم أيضًا بتنفيذ الخصائص المحسوبة startIndex و endIndex ، والتي تمثل بالفعل موضع الفهرس قبل مجموعة الحروف الأولى ، وموضع الفهرس بعد مجموعة الحروف الأخيرة ، على التوالي . لذا ، في السلسلة "ABC" ، يكون موضع الفهرس قبل A هو 0 وبعد C هو 3. لذلك ، endIndex = 3 ، وهو أيضًا طول السلسلة.

لذلك ، يمكن استخدام endIndex للحصول على طول أي نوع سلسلة ، ثم ، أليس كذلك؟

حسنًا ، ليس دائمًا ... يتم بالفعل دمج أحرف 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

للحصول على 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🐶🐶🐶

هنا شيء أقصر وأكثر طبيعية من استخدام وظيفة عالمية:

aString.utf16count

لا أعرف ما إذا كان متاحًا في الإصدار التجريبي 1 ، مع ذلك. لكنها بالتأكيد موجودة في النسخة التجريبية 2.


سويفت 4

let str =  "Your name"

str.count 

تذكر: يتم حساب المساحة أيضًا في الرقم


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

countElements(str)

هذا يحسب الشخصيات في سلسلة سويفت العادية

countElements((newString as String))    

هذا يحسب الشخصيات في NSString


Swift 2.0: الحصول على عدد: yourString.text.characters.count

ومن الأمثلة الممتعة على مدى فائدة ذلك إظهار عرض عد تنازلي من بعض الأرقام (150 على سبيل المثال) في UITextView:

func textViewDidChange(textView: UITextView) {
    yourStringLabel.text = String(150 - yourStringTextView.text.characters.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
    }
}

سويفت 4 تحديث مقارنة مع سويفت 3

يزيل Swift 4 الحاجة إلى مصفوفة أحرف على السلسلة. وهذا يعني أنه يمكنك الاتصال مباشرة 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

الآن (في Swift 2.3) إذا كنت تستخدم:

myString.characters.count 

ستقوم هذه الطريقة بإرجاع نوع "المسافة" ، إذا كنت بحاجة إلى طريقة لإرجاع عدد صحيح ، فيجب عليك كتابة نمط مثل:

var count = myString.characters.count as Int

String و NSString هي جسر مجاني ، لذا يمكنك استخدام جميع الطرق المتاحة لـ NSString مع سلسلة سريعة

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

أبل جعلها مختلفة عن غيرها من اللغات الرئيسية. الطريقة الحالية هي الاتصال:

test1.characters.count

ومع ذلك ، توخ الحذر ، عندما تقول طولًا تعني عدد الأحرف وليس عدد البايتات ، لأن هاتين الأثنتين يمكن أن تكون مختلفة عند استخدام أحرف غير ascii.

فمثلا؛ "你好啊hi".characters.count سيمنحك 5 لكن ليس هذا هو عدد البايتات. للحصول على العدد الحقيقي للبايت ، تحتاج إلى القيام "你好啊hi".lengthOfBytes(using: String.Encoding.utf8) . هذا سوف يعطيك 11.


هناك طريقة للإثبات المستقبلي و / أو منع الكتابة فوق النموذج الأولي الموجود سيكون اختبار التحقق لمعرفة ما إذا كان قد تمت إضافته بالفعل إلى النموذج الأولي للسلسلة. إليك طريقة عرضي على الإصدار غير المعتمد عالي التصنيف.

if (typeof String.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}




swift string