AeroHelpers 1.0.2

AeroHelpers 1.0.2

Stanislav Telnov维护。



  • Stas Telnov

AeroHelpers

一组帮助器和包装器

组成

包含三个模块

要求

  • iOS 10.0+
  • Xcode 10.2+
  • Swift 5+

安装

iPhonePods

在您的Podfile中添加以下行

pod 'AeroHelpers'

然后在您的项目文件夹的终端中执行pod install命令。请记住,在使用前将import AeroHelpers添加到您计划初始化库的文件中。在AeroHelpers中包含了所有模块。然而,如果需要,也可以单独安装模块,例如

pod 'AeroHelpers/Int'
pod 'AeroHelpers/UIView'

手动

master分支(稳定版本)或从发布中的您感兴趣的版本下载存档。解压并将所需的模块从文件夹AeroHelpers移动到您的项目中。

文档和示例

UIViewController

Identifiable

为view controller提供唯一的标识符。

文档

符合Identifiable协议的UIViewController有两个属性

static var reuseIdentifier: String { get }
var reuseIdentifier: String { get }

每个属性都返回从UIViewController继承的类名

示例和案例使用

import AEROHelpers
import UIKit

class DetalisViewController: UIViewController, Identifiable { // Обьявляем что DetalisViewController соответствует протоколу Identifiable
    //...
}
...
class SomeViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
        case DetalisViewController.identifier: // Id перехода на DetalisViewController соответствует классу DetalisViewController
            // делаем что необходимо, внедряем в DetalisViewController, etc
        default:
            break
        }
    }
}

UIView

加载指示器

在任何视图中显示的加载指示器。

文档

每个 UIView 都会有两个方法和一个属性。

var isLoadingProgress: Bool

func showLoading(fogging: Bool = true, fogColor: UIColor? = .none, indicatorStyle: UIActivityIndicatorView.Style? = .none, indicatorColor: UIColor? = .none) 
func hideLoading()

第一个方法是启动加载指示器,在整个 UIViewframe 上。第二个方法是停止该指示器。属性 isLoadingProgress 返回 true 时表示指示器当前处于活动状态。如果没有指定 fogColor,则阴影颜色将是透明的浅灰色,透明度为 0.4。indicatorStyle 默认为 grey

通过 Appearance(它是 LoadingIndicator 类的一个实例)可以配置以下参数:

  • fogColor - 阴影颜色。
  • indicatorStyle - 加载指示器样式。
  • indicatorColor - 加载指示器的颜色。
示例和案例使用
import AEROHelpers
import UIKit

class ViewController: UIViewController {
    @IBOutlet private var startLoadingButton: UIButton?
    
    @IBAction private func tapStartLoadingButton() {
        startLoadingButton?.showLoading()
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) { // или, например, запрос к серверу
            self.startLoadingButton?.hideLoading()
        }
    }
}

配置 Appearance 的示例

LoadingIndicator.appearance().fogColor = .red
LoadingIndicator.appearance().indicatorStyle = .whiteLarge
LoadingIndicator.appearance().indicatorColor = .blue

XibLoadable

从 xib 文件加载自定义 UIView

文档

任何遵循 XibLoadable 协议的自定义 UIView 都已经有了一个 loadXib() 方法。这个方法会从对应类名的 xib 文件中加载视图。需要在视图初始化时调用此方法。

示例和案例使用
import AEROHelpers
import UIKit

class SomeCustomView: UIView, XibLoadable {

    @IBOutlet var label: UILabel?
    @IBOutlet var button: UIButton?

    
    override init(frame: CGRect) { // при инициализации в коде
        super.init(frame: frame)
        loadXib()
    }
    
    required init?(coder aDecoder: NSCoder) { // при инициализации из другого xib/storyboard
        super.init(coder: aDecoder)
        loadXib()
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        //настраиваем view...
    }
}

SomeCustomView.xib 文件中指定 file owner: 使用这样的视图既可以与 xib/storyboard 一起使用,也可以通过代码创建和添加到视图上。

ReuseIdentifiable

UIView 提供唯一的标识符。

文档

主要用于 UITableViewCellUICollectionViewCell,用于注册具有 xib 文件布局的单元格,并在 UITableViewUICollectionViewcellForRow 方法中通过标识符获取单元格。任何实现 ReuseIdentifiable 协议的 UIView 将出现两个属性

static var reuseIdentifier: String { get }
var reuseIdentifier: String { get }

返回每个类的唯一标识符,名称与类名相符。

示例和案例使用
//Coming soon...

Int

变形

根据实体数量调整单词。

文档

所有整数类型的 Int 都获得了

  • DeclensionsVariants 结构,包含一个变体列表;
  • defaultsDeclensions 属性,包含预置的 DeclensionsVariants 列表
  • declension 方法,执行直接变形

DeclensionsVariants 结构包含 3 个属性

  1. oneVariant 应包含一个符合条件的变体:被 10 除的余数等于 1(1 天,21 天,1361 天)。
  2. mediumVariant 应包含一个符合条件的变体:被 10 除的余数在 2 到 4 之间(包括 2 和 4)(2 天,24 天,1363 天)。
  3. othersVariants 应包含一个符合条件的变体:被 100 除的余数在 5 到 20 之间(包括 5 和 20),或被 10 除的余数(10 天,111 天,14 天)

defaultsDeclensions 属性返回包含现有变形类型的结构。这是

  • days - 天(“一天”, “天的”, “天的”)
  • seconds - 秒(“一秒”, “秒的”, “秒的”)
  • stones - 石头(“一块石头”, “石头的”, “石头的”)
  • products - 产品(“一个产品”, “产品的”, “产品的”)
  • productsGoods - 货物(“一个货物”, “货物的”, “货物的”)
  • items - 元素(“一个元素”, “元素的”, “元素的”)
示例和案例使用
// Предустановленные варианты:
print("Ждём \(23) \(12.defaultsDeclensions.seconds)") // Ждём 23 секунды
print("Доставка через \(86) \(86.defaultsDeclensions.days)") // Доставка через 86 дней

// Кастомные варианты:
let variants = Int.DeclensionsVariants("год", "года", "лет")
print("Ему \(5) \(5.declension(variants))") // Ему 5 лет
print("Где-то \(23) \(23.declension(variants)) назад") // Где-то 23 года назад
print("Спустя \(13) \(10.declension(variants))") // Спустя 13 лет

字符串

HTML

将包含 HTML 标签和 HTML 实体的字符串转换为相应的 NSAtributtedString

文档

扩展 String 结构,包括以下方法

  • html - 尝试将含有 HTML 的字符串转换为其相应的 NSAttributedString。如果失败返回 nil。
  • htmlDecoded - 尝试删除或解码所有 HTML 实体,并将 HTML 字符串转换为普通字符串。如果失败返回 nil。
  • nl2br - 从字符串中删除所有 \r 字符,并将所有 \n 字符替换为 <br/> 标签。
  • br2nl - 将字符串中的所有 <br/> 标签替换为 \n 字符。
示例和案例使用

html

let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te&nbsp;&nbsp;st<br><br> <b>bold</b> </font>"
print("\(htmlString.html!)")

结果

Start 
te  st

{
    NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSFont = "<UICTFont: 0x157e01220> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 32.00pt";
    NSKern = 0;
    NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
    NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSStrokeWidth = 0;
}bold{
    NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSFont = "<UICTFont: 0x157e0c870> font-family: \"Helvetica\"; font-weight: bold; font-style: normal; font-size: 32.00pt";
    NSKern = 0;
    NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
    NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSStrokeWidth = 0;
} {
    NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSFont = "<UICTFont: 0x157e01220> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 32.00pt";
    NSKern = 0;
    NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
    NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
    NSStrokeWidth = 0;
}

htmlDecoded

let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te&nbsp;&nbsp;st<br><br> <b>bold</b> </font>"
print("\(htmlString.htmlDecoded!)")

结果

Start 
te  st

bold 

br2nl

let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te&nbsp;&nbsp;st<br><br> <b>bold</b> </font>"
print("\(htmlString.nl2br)")

结果

<font style="font-family: Helvetica; font-size: 24pt; ">Start 
te&nbsp;&nbsp;st

 <b>bold</b> </font>

nl2br

let htmlString = "Start \nte&nbsp;&nbsp;st\n\n <b>bold</b>"
print("\(htmlString.br2nl)")

结果

Start <br/>te&nbsp;&nbsp;st<br/><br/> <b>bold</b>

Marked

使用颜色和字体突出显示子字符串。

文档

结构扩展 String 包含以下方法 markSubstrings

    func markSubstrings(_ markedSubstrings: [String],
                        mainFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize),
                        mainColor: UIColor = .darkText,
                        markFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize),
                        markColor: UIColor = .blue,
                        isOnlyFirst: Bool = false) -> NSAttributedString?

除了 markedSubstrings 之外,所有参数都是可选的。

输入参数

  • markedSubstrings:需要突出的子字符串列表;
  • mainFont:主要字体,默认为系统字体,系统大小;
  • mainColor:主要文本颜色,默认为 darkText
  • markFont:突出显示子字符串的字体,默认与主要文本字体相同;
  • markColor:突出显示子字符串的颜色,默认为蓝色;
  • isOnlyFirst:如果值为 true,则将突出显示所有子字符串的出现,否则仅突出显示第一个找到的。默认为 false

通过 Appearance 类的 MarkedSubstrings 类可以设置以下参数

  • mainFont.
  • mainColor.
  • markFont.
  • markColor.
示例和案例使用
let testString = "Test with test for test if testing is available."
let markedString = testString.markSubstrings(["test"])
print("\(markedString)")

结果:

let testString = "Test with test for test if testing is available."
let font = UIFont(name: "Futura-Bold", size: 24)

let markedString = testString.markSubstrings(["test"], markFont: font!, markColor: .red, isOnlyFirst: true)
print("\(markedString)")

结果:

配置 Appearance 的示例

MarkedSubstrings.appearance().mainFont = .systemFont(ofSize: 20)
MarkedSubstrings.appearance().mainColor = .grey
MarkedSubstrings.appearance().markFont = .systemFont(ofSize: 18)
MarkedSubstrings.appearance().markColor = .brown

Currency

根据设定的区域、货币符号和其他参数格式化字符串(或数字)为价格。

文档

类型如 String、Int、Float、Double 扩展以符合 CurrencyFormatted 协议并实现此方法

    func currency(mainFont: UIFont,
                  mainColor: UIColor,
                  locale: Locale,
                  symbol: String,
                  prefix: String?,
                  postfix: String?,
                  count: Int?,
                  countFont: UIFont?,
                  countColor: UIColor?,
                  minFraction: Int,
                  maxFraction: Int,
                  isStriked: Bool) -> NSAttributedString?

所有字段都是可选的,并具有默认值。如果无法将字符串解析为价格,则返回 nil。同样,CurrencyFormatted 协议还有一个静态方法

    public static func currencySymbol(for localeIdentifier: String = "ru_RU") -> String

返回货币符号。它用作默认货币。

主要方法 currency 将逗号转换为点,然后从字符串中删除所有非数字字符,除了负号 (-) 和点 (.). 然后格式化字符串。在此情况下,它作为整数部分和小数部分的分隔符。如果点多于一个,则方法返回 nil。

输入参数

  • mainFont:价格字符串字体。默认为系统字体系统大小。
  • mainColor:价格字符串颜色。默认为 darkText 颜色。
  • locale:格式化价格的区域。默认为当前设备的当前区域。
  • symbol:要使用的货币符号。默认为执行静态函数 currencySymbol 的结果,返回 ru_RU 区域的符号(俄罗斯卢布)。
  • prefix:将放在价格前面的前缀。默认为 nil。
  • postfix:将放在价格后面的后缀。默认为 nil。
  • count:商品数量。默认为 nil。如果值大于 1,则在价格前面将出现此值加 ' x '。例如,对于值为 3 和价格为 100,将出现 '3 x 100 ₽'。
  • countFont:商品数量字体。默认为 nil 和与参数 font 一致。
  • countColor:商品数量颜色。默认为 nil 和与参数 color 一致。
  • maxFraction:小数点后最小位数。默认值为 0。
  • maxFraction:小数点后的最大位数。默认值为0。
  • isStriked:如果值为true,则价格值将被划掉。默认为false

通过Appearance可以配置以下参数,使用CurrencyFormat类:

  • mainFont
  • mainColor
  • locale
  • symbol
  • prefix
  • postfix
  • countFont
  • countColor
  • maxFraction
  • maxFraction
示例和案例使用
let defaultFont = UIFont.systemFont(ofSize: 18)
let defaultColor = UIColor.black

//1.
1234.4345.currency(font: defaultFont, color: defaultColor, maxFraction: 2)

//2.
" - 1 234 рублей.".currency(font: defaultFont, color: .red, prefix: "prefix", postfix: "postfix", isStriked: true)

//3.
"1 2 sd 3 ggdf4 рублей".currency(font: defaultFont, color: defaultColor, count:5)

//4.
let locale = Locale(identifier: "en_US")
let symbol = String.currencySymbol(for: "fr_FR")
"1  234  (тысяча двести тридцать четыре)".currency(font: defaultFont,
                                                    color: defaultColor,
                                                    locale: locale,
                                                    symbol: symbol,
                                                    count:2,
                                                    countFont: .boldSystemFont(ofSize: 22),
                                                    countColor: .blue)

结果:

通过Appearance设定属性的示例

CurrencyFormat.appearance().mainFont = .systemFont(ofSize: 20)
CurrencyFormat.appearance().mainColor = .grey
CurrencyFormat.appearance().symbol = .currencySymbol(for: "us_US")
CurrencyFormat.appearance().countColor = .red

HEXColorable

检查字符串是否是颜色HEX表示形式,如果可能,转换为UIColor

文档

String结构通过ColoredString协议进行了扩展,该协议具有两个属性

    var isHexColor: Bool { get }
    var color: UIColor? { get }
  • isHexColor检查字符串是否为HEX颜色表示。
  • color尝试从字符串创建UIColor对象。失败时返回nil。

支持完整格式的全(#FFAA99)和缩短格式的缩写(#FA9)。井号(#)不是必须的。

示例和案例使用
        print("\("#FF8822".isHexColor)")
        print("\("#FF8822".color!)")
        print("\("FF8822".color!)")

结果

true
UIExtendedSRGBColorSpace 1 0.533333 0.133333 1
UIExtendedSRGBColorSpace 1 0.533333 0.133333 1

RemoveCharacters

从字符串中移除所有在传递的子串中存在的字符。

文档

String结构被扩展,并添加了一个方法

func removeCharacters(_ list: String, ignoreCase: Bool = false) -> String

该方法从目标字符串中移除所有在传递的list子串中存在的字符。如果ignoreCase被传递为true,则不受字母大小写的影响。

示例和案例使用
        let string = "Test with test for test if testing is available."
        
        print("\(string.removeCharacters("teail"))")
        print("\(string.removeCharacters("TEAIL", ignoreCase: true))")

结果

Ts wh s for s f sng s vb.
s wh s for s f sng s vb.