Използвайте R.swift, за да почистите препратките към NSLocalizedString и UIImage

Наскоро ми беше възложено да внедря фантастична библиотека, наречена R.swift,която изчиства всички ресурси във вашия проект и позволява лесното им препращане.

Тази статия няма да навлиза в подробности за библиотеката твърде много. Вместо това бих искал да ви покажа колко полезна е функцията Xcode „намиране и замяна с регулярни изрази“ и как ми помогна да спестя много време, което бих прекарал неуморно в поправяне на стотици редове код един по един .

Задачата беше да заменим всички наши NSLocalizedString иUIImage препратки, като използваме R.swift начина за получаване на ресурс.

Например получаване на локализиран низ като този:

NSLocalizedString("common_cancel", comment: "Cancel")

Трябваше да бъде заменен със следното:

R.string.localizable.common_cancel()

Тъй като имаме над 1000 локализирани ресурса за низове и изображения в нашето приложение, замяната на всяка препратка една по една би била доста трудоемка задача. За щастие открих страхотна функция на Xcode, която беше точно това, от което имах нужда.

Намиране и заместване с помощта на регулярни изрази

Регулярният израз или регулярният израз ви позволява да дефинирате модел за търсене, като използвате специален синтаксис, който съответства на текста, който може да търсите. Освен това ви позволява да заснемете части от текст за повторна употреба.

В случай, че не сте използвали тази функция на Xcode, можете да намерите опцията в навигатора на вашия проект.

Кликнете върху „Намиране“, превключете го на „Замяна“. Кликнете върху „Текст“ и го превключете на „Регулярен израз“.

Помислете за този израз:

NSLocalizedString\("(.*)",(?:.*)

Това, което прави, е, че търси всеки текст, който започва с NSLocalizedString, и съхранява съдържанието на кавичките на първия параметър. Тъй като това е всичко, което трябва да уловя, игнорирам всеки знак след първия параметър.

Нека разбием израза малко повече.

Обратната наклонена черта след NSLocalizedString е необходима за екраниране на знака за отворена скоба.

Обърнете внимание, че специалните символи трябва да бъдат екранирани с обратна наклонена черта. Ако срещнете проблем, при който изразът ви не работи, уверете се, че избягвате специалните знаци.

(.*)Скобите създават номерирана група за улавяне. Това ви позволява да съхранявате част от низа, който съответства на вашия израз, за ​​да бъде извлечен за по-късно.

Точката указва произволен знак, а asterisk указва нула или повече екземпляри на предходния символ на регулярен израз. Следователно, улавяне каквото и да е съдържанието на скобите.

От моя пример, той ще улови common_cancel, което е името на моя локализиран низов ресурс. Това е частта от текста, която ме интересува и се нуждая за моята подмяна на низ.

(?:.*)Скобите с въпросителен знак и двоеточие създават група без прихващане. Чието съдържание се изхвърля. Тъй като скобите съдържат друга точка и звездичка, те игнорират останалите знаци в моя ред код.

И така, сега, когато регулярният ми израз съвпада с всички екземпляри на NSLocalizedString в моя проект, съм готов да ги заменя със следния ред:

R.string.localizable.$1()

$1е номерираната препратка, която съдържа моя заснет текст. Ако натисна замени, получавам точно това, от което имах нужда.

R.string.localizable.common_cancel()

невероятно! Всички стотици екземпляри, на които съвпадна изразът, незабавно се заменят с новия ред код, от който се нуждая. Спестено огромно количество време.

Актуализиране на ресурсите за изображения

Следващата актуализация, която трябваше да направя, беше много подобна на предишния пример. Този път ресурсът е всяка UIImageреференция в моя проект.

Получаване на изображение като това:

UIImage(named: "menuIcon")

Трябваше да бъде заменен от R.swiftначина за препратка към изображение:

R.image.menuIcon()

Отново, единственото нещо, което трябва да бъде заснето, е името на изображението. В този пример беше menuIcon.

Това е регулярният израз, който използвах:

UIImage\(named: "(.*)"\)

Съвпадна с всички мои UIImage препратки и съхрани името на изображението, от което се нуждаех. Подобно на предишния пример, замених всички препратки с този ред:

R.image.$1()

В резултат на това:

R.image.menuIcon()

В този момент приключих. Това, което можеше да ми отнеме няколко часа, вместо това ми отне минути.

Ако срещнете подобен тип задача за технологичен дълг, опитайте и вижте дали можете да използвате намирането и замяната с регулярни изрази. Бях напълно начинаещ с регулярни изрази, докато работех върху тази задача, така че това беше хубаво постижение за мен. Бях много развълнуван, когато накарах всичко да работи.

Надяваме се, че тази статия е била полезна за някои от вас. И накрая, вижте R.swift. Това е невероятен инструмент, който силно препоръчвам и ще използвам за всичките си бъдещи проекти за iOS.