Nano Hash - криптовалюты, майнинг, программирование

Как проверить, начинается ли строка с буквы алфавита в Swift 5?

Проблема: в настоящее время я пытаюсь Sort a List in SwiftUI в соответствии с Items First Character. Я также хотел бы реализовать Section для всех элементов, которые doesn't begin с Character of the Alphabet (числа, специальные символы).

Мой код на данный момент:

let nonAlphabetItems = items.filter { $0.name.uppercased() != /* beginns with A - Z */ }

У кого-нибудь есть решение этой проблемы. Конечно, я мог бы сделать огромную Loop Construct, но я надеюсь, что есть более элегантный способ.

Спасибо за вашу помощь.


  • Буква включает нестандартные буквы или только A...Z? Следует ли считать Ç буквой? 18.12.2020
  • @LeoDabus Только стандартные буквы от A до Z. Специальные буквы, такие как Ç, а также цифры и специальные символы должны проходить фильтрацию. 18.12.2020

Ответы:


1

Вы можете проверить, содержит ли диапазон строк "A"..."Z" первую букву вашего имени:

struct Item {
    let name: String
}

let items: [Item] = [.init(name: "Def"),.init(name: "Ghi"),.init(name: "123"),.init(name: "Abc")]

let nonAlphabetItems = items.filter { !("A"..."Z" ~= ($0.name.first?.uppercased() ?? "#")) }

nonAlphabetItems  // [{name "123"}]

Расширяя эту тему, мы можем расширить Character, чтобы добавить свойство isAsciiLetter:

extension Character {
    var isAsciiLetter: Bool { "A"..."Z" ~= self || "a"..."z" ~= self }
}

Это позволит расширить StringProtocol, чтобы проверить, начинается ли строка с буквы ascii:

extension StringProtocol {
    var startsWithAsciiLetter: Bool { first?.isAsciiLetter == true }
}

И просто помощник для отрицания логического свойства:

extension Bool {
    var negated: Bool { !self }
}

Теперь мы можем отфильтровать коллекцию элементов следующим образом:

let nonAlphabetItems = items.filter(\.name.startsWithAsciiLetter.negated)   // [{name "123"}]
18.12.2020
  • Спасибо за Ваш ответ. Что такое оператор ~=? 18.12.2020
  • В этом случае это то же самое, что и содержит. Это называется оператором сопоставления с образцом. Это также может быть записано как {!("A"..."Z").contains(($0.name.first?.uppercased() ?? "#")) } 18.12.2020
  • Спасибо, это работает отлично. 18.12.2020
  • Не за что 18.12.2020

  • 2

    Вы можете использовать NSCharacterSet следующим образом:

    
    let phrase = "Test case"
    let range = phrase.rangeOfCharacter(from: characterSet)
    
    // range will be nil if no letters is found
    if let test = range {
        println("letters found")
    }
    else {
       println("letters not found")
    }```
    
    18.12.2020
  • ОП пытается проверить первый символ только начинается с 18.12.2020

  • 3

    Вы можете иметь дело со значением ascii

    extension String {
        var fisrtCharacterIsAlphabet: Bool {
             guard let firstChar = self.first else { return false }
             let unicode = String(firstChar).unicodeScalars
             let ascii = Int(unicode[unicode.startIndex].value)
             return (ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122)
        }
        
    }
    
    var isAlphabet = "Hello".fisrtCharacterIsAlphabet
    
    18.12.2020

    4

    Тип Character имеет для этого свойство:

    let x: Character = "x"
    x.isLetter // true for letters, false for punctuation, numbers, whitespace, ...
    

    Обратите внимание, что это будет включать символы из других алфавитов (греческий, кириллический, китайский, ...).

    Поскольку String является Sequence, а Element равно Character, мы можем использовать свойство .first для получения первого символа.

    При этом вы можете фильтровать свои товары:

    let filtered = items.filter { $0.name.first?.isLetter ?? false }
    
    18.12.2020
  • isLetter также будет содержать нежелательные буквы. Вот почему я разместил комментарий, спрашивая об этом в первую очередь. developer.apple.com/documentation/swift/character/ 18.12.2020

  • 5

    Вы можете сделать это с помощью этого простого расширения String

    extension StringProtocol {
        var isFirstCharacterAlp: Bool {
            first?.isASCII == true && first?.isLetter == true
        }
    }
    

    Использование:

    print ("H1".isFirstCharacterAlp)
    print ("ابراهيم1".isFirstCharacterAlp)
    

    Вывод

    true
    false
    

    Удачного кодирования!

    Справочник

    18.12.2020
  • Почему бы просто не использовать свойство Character isLetter, предложенное Palle? Кстати, это не решит вопрос, потому что он также будет включать буквы, отличные от ascii. 18.12.2020
  • @LeoDabus Я обновил свой ответ. Спасибо за указание на ограничение ASCII. Я пропустил комментарии. 18.12.2020
  • ИМО self.first?.isASCII == true читается намного лучше, чем self.first?.isASCII ?? false. Кстати скобки не нужны first?.isASCII == true && first?.isLetter == true 18.12.2020
  • @LeoDabus Да, удаление скобок выглядит чище, согласился и обновил блок кода. 18.12.2020
  • Я бы просто удалил префикс self и вместо этого расширил StringProtocol для поддержки подстрок. 18.12.2020
  • Согласен Спасибо за предложения. 18.12.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..