<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/mslibrary/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя mslibrary]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 30 Apr 2026 22:39:27 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[MSLibrary. ПРОСТО: объявляем глобальные переменные с помощью класса singleton, для iOS и не только…]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/282169/</guid>
      <link>https://habr.com/ru/articles/282169/?utm_campaign=282169&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Разработчики библиотеки  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> for iOS продолжают серию очень компактных статей, посвященных тому как ПРОСТО реализовать ту или иную функцию. Никакой теории, только практика…<br/>
<br/>
Итак, как правильно объявить глобальные переменные? Под глобальными мы понимаем переменные, объявленные на внешнем уровне (не static) и имеющие глобальное время жизни.<br/>
<br/>
Если мы объявим переменную в одном из заголовочных файлов, например в файле MyClass.h таким, казалось бы логичным, образом:<br/>
<br/>
<pre><code>NSString *myGlobalVariable;
</code></pre><br/>
а затем импортируем файл MyClass.h с помощью директивы #import в несколько файлов, например, MyClass1.h, MyClass2.h, MyClass3.h и MyClass4.h, то в результате с большой вероятностью получим примерно такое сообщение об ошибке:<br/>
<br/>
<pre><code class="xml">duplicate symbol _myGlobalVariable in:
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass1.o
duplicate symbol _myGlobalVariable in:
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass2.o
duplicate symbol _myGlobalVariable in:
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass3.o
duplicate symbol _myGlobalVariable in:
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o
    /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass4.o

ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
</code></pre><br/>
Произойдет это по тому, что в результате импорта переменная myGlobalVariable будет объявлена в каждом из подключенных файлов. <a href="https://habr.com/ru/articles/282169/?utm_campaign=282169&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 21 Apr 2016 14:58:49 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Objective C]]></category><category><![CDATA[Xcode]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category>
      <category><![CDATA[переменные]]></category><category><![CDATA[глобальные переменные]]></category><category><![CDATA[синглтон]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под iOS]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[iOS library]]></category><category><![CDATA[iOS библиотеки]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[MSLibrary. Создание и компиляция кроссплатформенных (универсальных) библиотек в Xcode]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/280286/</guid>
      <link>https://habr.com/ru/articles/280286/?utm_campaign=280286&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Очередная статья от команды разработчиков библиотеки  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> for iOS посвящена довольно популярной теме создания и компиляции кроссплатформенных библиотек. <br/>
<br/>
Библиотеки хороши тем, что позволяют использовать разработанный ранее программный код в различных программах. Таким образом, программисты могут существенно упростить себе работу и сократить время ее выполнения, воспользовавшись для части стандартного функционала готовыми решениями, которые входят в состав библиотек. В статье рассматриваются только статические библиотеки, код которых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой.<br/>
<br/>
Мы постарались как можно подробнее и систематичнее осветить вопрос, рассмотрев создание библиотеки «с нуля» и упаковку в библиотеку части функционала уже готового проекта. Под кроссплатформенностью или универсальностью мы подразумевали совместимость библиотеки как с симуляторами, работающими на процессоре с архитектурой i386 или x86_64, так и с реальными девайсами, процессор которых, вероятнее всего, имеет архитектуру armv7 или armv64.<br/>
<br/>
<h4><b>1. Создаем проект библиотеки</b></h4><br/>
При разработке библиотеки перед разработчиком может быть два пути, первый — библиотека создается «с нуля» и второй — в вашем проекте есть некий функционал, на основе которого вы хотите создать библиотеку. Рассмотрим оба.<br/>
 <a href="https://habr.com/ru/articles/280286/?utm_campaign=280286&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 28 Mar 2016 04:53:37 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Xcode]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category>
      <category><![CDATA[ios development]]></category><category><![CDATA[бинарные операции]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под iOS]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[iOS library]]></category><category><![CDATA[iOS библиотеки]]></category><category><![CDATA[lipo]]></category><category><![CDATA[компиляция библиотек]]></category><category><![CDATA[xcode]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[MSLibrary. ПРОСТО: удаляем из строки ненужные символы, используя регулярные выражения, для iOS и не только…]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/279563/</guid>
      <link>https://habr.com/ru/articles/279563/?utm_campaign=279563&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[В дополнение к большим и подробным материалам, разработчики библиотеки  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> for iOS решили начать серию очень компактных статей, посвященных тому как ПРОСТО реализовать ту или иную функцию. Никакой теории, только практика…<br/>
<br/>
Итак, удаляем из строки ненужные символы, используя регулярные выражения, с помощью простой функции:<br/>
<br/>
<pre><code>NSString *yourFuncionName(NSString *string) {
    NSString *regExString = @&quot;yourRegularExpression&quot;;
    NSRegularExpression *_regEx = [NSRegularExpression regularExpressionWithPattern:regExString options:NSRegularExpressionCaseInsensitive error:nil];
    return [_regEx stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@&quot;&quot;];
}
</code></pre><br/>
Вот, собственно, и все, осталось подобрать подходящее регулярное выражение, которое решает поставленные вами задачи. <br/>
<br/>
Несколько полезных регулярных выражений:<br/>
<br/>
<pre>
    \\s - удаляет все пробелы
    [-:_\\.] - удаляет все символы, находящиеся в квадратных скобках
    [:^digit:] - оставляет только цифры
    [:^alpha:] - оставляет только буквы
    [:^alnum:] - оставляет только буквы и цифры
    [:^word:] - оставляет только буквы, цифры и подчеркивания
</pre> <a href="https://habr.com/ru/articles/279563/?utm_campaign=279563&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 17 Mar 2016 16:14:30 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category><category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[регулярные выражения]]></category><category><![CDATA[перечисления]]></category><category><![CDATA[enum]]></category><category><![CDATA[двоичные числа]]></category><category><![CDATA[бинарные операции]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под iOS]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[iOS library]]></category><category><![CDATA[iOS библиотеки]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[MSLibrary. Реализация множественного выбора условий с помощью битовых масок, для iOS и не только…]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/279441/</guid>
      <link>https://habr.com/ru/articles/279441/?utm_campaign=279441&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Мы продолжаем публикацию материалов, от разработчиков библиотеки  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> for iOS. Тема этой статьи не случайна, проблема выбора нескольких условий из заданного множества, не редко встречается в нашей работе. Простейший пример — выбор партнера для игры (свидания, путешествия и тд). Выбор надо осуществлять из нескольких групп, сформированных по уровню подготовленности (здесь могут быть и возрастные группы и все что угодно). Условие — дать пользователю возможность выбрать партнера из одной или нескольких групп одновременно. Другим примером могут служить константы <a href="https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/#//apple_ref/c/tdef/NSRegularExpressionOptions"> NSRegularExpressionOptions </a> проверки типа данных для класса <a href="https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/"> NSRegularExpression</a>. При подстановке этих констант в методы класса, мы можем записать:<br/>
<br/>
<pre>	NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators </pre><br/>
Объединив константы знаком логического «ИЛИ» мы будем уверены, что проверим анализируемую строку на соответствие обоим из заданных условий.<br/>
<br/>
Один из способов реализации подобной задачи — использование списка констант в виде перечисления enum, в котором элементы перечисления представляют собой двоичные числа с одним установленным битом. Сделать это не очень сложно, но сначала немного теории. Вспомним такие битовые операции, как «СДВИГ», «И», «ИЛИ».<br/>
 <a href="https://habr.com/ru/articles/279441/?utm_campaign=279441&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 16 Mar 2016 12:40:44 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category><category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[регулярные выражения]]></category><category><![CDATA[перечисления]]></category><category><![CDATA[enum]]></category><category><![CDATA[двоичные числа]]></category><category><![CDATA[бинарные операции]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под iOS]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[iOS library]]></category><category><![CDATA[iOS библиотеки]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[MSLibrary. Захват и верификация телефонных номеров с помощью регулярных выражений, для iOS и не только… Часть 2]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/278359/</guid>
      <link>https://habr.com/ru/articles/278359/?utm_campaign=278359&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[В <a href="https://habrahabr.ru/post/278345/"> первой части статьи </a> разработчики библиотеки  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> for iOS рассказали об особенностях структуры телефонных номеров с точки зрения международных стандартов, опубликованных в документе <a href="https://tools.ietf.org/html/rfc3986"> RFC 3966 </a>, рассмотрели Международную структуру телефонных номеров, корпоративные WEB стандарты набора телефонного номера, их взаимодействие между собой и то, как ведут себя пользователи.<br/>
Как уже было сказано, захват и верификация это — разные задачи, но решаются они схожими методами, различающимися в основном применяемыми в них регулярными выражениями. <i>Во второй части статьи речь пойдет собственно о регулярных выражениях.</i><br/>
<br/>
<b>Верификация телефонных номеров</b><br/>
<br/>
Возможно несколько подходов к постановке задачи верификации или валидации строки телефонного номера.<br/>
1. выбрать один наиболее простой вариант написания валидного номера и сконструировать для него регулярное выражение<br/>
2. рассмотреть максимально большое множество валидных написаний телефонных номеров и сконструировать регулярное выражение под них<br/>
<br/>
Оба подхода имеют право на существование, но каждый из них влечет за собой определенные последствия.<br/>
В первом случае либо пользователю придется вводить номер в том виде, в каком производится верификация, что часто приводит к ошибкам и, как следствие, к негативному отношению к приложению. Либо от разработчика потребуется создавать шаблон для ввода данных или дополнительный код, приводящий введенные данные к выбранному валидному виду.<br/>
Во втором случае можно обойтись без шаблона и дополнительного кода, ограничившись небольшой инструкцией типа «вводите телефонный номер без пробелов».<br/>
<br/>
Рассмотрим оба варианта, но сначала общие соображения.<br/>
<br/>
Валидация строки телефонного номера, чтобы он был адекватно обработан iOS, сводится к нескольким условиям:<br/>
1. общая структура номера должна соответствовать документу <a href="https://tools.ietf.org/html/rfc3986"> RFC 3966 </a><br/>
<br/>
<pre><code class="xml">telephone-uri = global-number-digits [extension]</code></pre><sub><b>рис. 1</b></sub>  <a href="https://habr.com/ru/articles/278359/?utm_campaign=278359&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 03 Mar 2016 12:30:36 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category><category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[регулярные выражения]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под ios]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[ios library]]></category><category><![CDATA[ios библиотеки]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[MSLibrary. Захват и верификация телефонных номеров с помощью регулярных выражений, для iOS и не только… Часть 1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/278345/</guid>
      <link>https://habr.com/ru/articles/278345/?utm_campaign=278345&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Поводом для появления серии статей, первая из которых представлена вашему вниманию, послужил большой аналитический и практический материал, накопившийся в процессе работы над библиотекой MSLibrary for iOS. Библиотека  <a href="https://habrahabr.ru/users/mslibrary/" class="user_link">MSLibrary</a> включает множество классов, и еще больше функций и макросов, призванных упростить рутинный труд разработчиков, существенно сократить сроки разработки и размер кода. Но, всему свое время, о библиотеке мы расскажем чуть позже.<br/>
<br/>
Итак, захват и верификация телефонных номеров с помощью регулярных выражений. Казалось бы, о чем здесь говорить? Кто умеет, напишет сам, а кто не умеет скопирует одно из множества готовых решений, разбросанных на просторах Всемирной паутины. Вопрос только в том, что он напишет и что скопирует и насколько этот код будет соответствовать поставленным задачам, а также действующим международным, отраслевым и корпоративным стандартам? Любое решение, даже самое простое, хорошо лишь в том случае, если разработчик полностью осознает его работу и абсолютно в нем уверен.<br/>
 <a href="https://habr.com/ru/articles/278345/?utm_campaign=278345&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 02 Mar 2016 10:03:15 GMT</pubDate>
      <dc:creator><![CDATA[MSLibrary]]></dc:creator>
      <category><![CDATA[Проектирование API]]></category><category><![CDATA[Разработка мобильных приложений]]></category><category><![CDATA[iOS]]></category><category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[регулярные выражения]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[разработка под ios]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[ios library]]></category><category><![CDATA[ios библиотеки]]></category>
    </item>
  

  

  

	
  

  

  

      

      

      

    
  </channel>
</rss>
