swift - ويندوز - كتاب شرح xcode




الحصول على طول سلسلة (20)

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

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

var test1: String = "Scott"

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


سويفت 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"

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

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

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

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

test1.characters.count

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

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


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

myString.isEmpty

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

NSString فارغ


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

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

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

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

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

let numberOfChars = textlength.characters.count

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

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

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

سويفت 4

let str =  "Your name"

str.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

في Swift 2.x التالية هي كيفية العثور على طول سلسلة

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

يعود 24


في Xcode 6.1.1

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

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


هذا ما انتهى به الأمر

let replacementTextAsDecimal = Double(string)

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

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

aString.utf16count

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


يمكنك الحصول على الطول ببساطة عن طريق كتابة ملحق:

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
    }
}

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

Swift 2.0 و 3.0 و 3.1:

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

Swift 4.0: [Apple Apple Documentation - Strings]

دعونا strLength = string.count


اعتبارا من سويفت 4

مع Swift 4 القادم ، سيكون فقط:

test1.count

لأسباب.

(شكرا لمارتن R)

اعتبارا من سويفت 2:

مع Swift 2 ، قامت Apple بتغيير الوظائف العالمية إلى ملحقات البروتوكول ، الإضافات التي تتطابق مع أي نوع يتوافق مع البروتوكول. وبالتالي الصيغة الجديدة هي:

test1.characters.count

(شكرا لجونديفول لرؤساء)

اعتبارا من سويفت 1

استخدم طريقة حساب الأرقام:

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

من دليل Apple Swift

(ملاحظة ، بالنسبة لإصدارات Swift السابقة على 1.2 ، سيكون هذا هو countElements(unusualMenagerie) بدلاً من ذلك)

للمتغير الخاص بك ، سيكون

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

أو يمكنك استخدام test1.utf16count


سويفت 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

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
}

test1.characters.count

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

مثلا:

test1 = ""

print(test1.characters.count)

( يطبع " 13 ")





string