Swift-技能小结(二)

上一篇: Swift-技能小结(一)

一, 自定义运算符, 判断是否是’null’字符串 二, 使用CGBlendMode更改图片颜色

自定义运算符 ?*

在开发中经常需要把接口的数据展示到界面上, 如果直接返回"null", 我们又不处理的话, 那么直接显示"null"在APP中, 是非常影响UI界面的美观和用户的体验.

处理方法: 自定义运算符 ?* 去代替null字符串

例:

let str = "null"
print(str ?* "--")

结果为:

--

实现代码如下:

/*
 运算符重载: 中置      前置      后置
 infix    prefix   postfix
 组合赋值运算符: assignment
 自定义运算符:
 全局域使用 operator 关键字声明
 自定义中置运算符的优先级和结合性:
 结合性(associativity) 取值有: left right none
 优先级(precedence)  默认为100
 Operator should no longer be declared with body; use a precedence group instead
 */
infix operator ?* : FriendlyString
precedencegroup FriendlyString {
    associativity: left             // 左结合
    higherThan: AdditionPrecedence  // 优先级高于加法类型
    lowerThan: MultiplicationPrecedence // 优先级低于减法类型
}

/// ?* 代替系统的 ?? 使用, 可以过滤 "null" 字符串
/// 使用方法 例: str ?* "--"
/// 结果为: 如果`str` 为空 或 `null`, 则返回 "--"字符串
///
/// - Parameters:
///   - str: 原始字符串
///   - defaultStr: 代替的字符串
/// - Returns: 过滤后的字符串
func ?*(str: String?, defaultStr: String) -> String {
    let s = str ?? ""
    if s == "null" || s == "<null>" || s.isKind(of: NSNull.self) {
        return defaultStr
    }
    return s
}

可以扩展一些方法, 当字符串为"null"时, 替换为固定的字符串 例:

/// 过滤字符串, 默认返回一个空字符 ""
///
/// - Parameter str: 原始字符串
/// - Returns: 过滤后的字符串
func defaultEmptyStr(_ str: String?) -> String {
    return str ?* ""
}

/// 过滤字符串, 默认返回一个 "--" 字符串
///
/// - Parameter str: 原始字符串
/// - Returns: 过滤后的字符串
func default__str(_ str: String?) -> String {
    return str ?* "--"
}

defaultEmptyStr(_ :) 函数, 当字符串为"null" 时, 默认使用一个空字符 default__str(_ :) 函数, 当字符串为"null"时, 默认返回"--"代替空字符

使用 CGBlendMode 更改图片颜色

例: 原始图片

原始图片

更改颜色后的图片

更改颜色后的图片

代码实现:

extension UIImage {
    func image(_ tintColor: UIColor, blendMode: CGBlendMode = .overlay) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        tintColor.setFill()
        let bounds = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        UIRectFill(bounds)
        draw(in: bounds, blendMode: blendMode, alpha: 1.0)
        if blendMode != .destinationIn {
            draw(in: bounds, blendMode: .destinationIn, alpha: 1.0)
        }
        let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return tintedImage ?? UIImage()
    }
}

使用方法:

image1.image = UIImage(named: "location")?.image(.red)
image2.image = UIImage(named: "location")?.image(.orange)
image3.image = UIImage(named: "location")?.image(.gray)
image4.image = UIImage(named: "location")?.image(.yellow)
image5.image = UIImage(named: "location")?.image(.brown)
image6.image = UIImage(named: "location")?.image(.purple)

CGBlendMode的方法详细描述请参考喵神的博客iOS中使用blend改变图片颜色

Loading Disqus comments...
Table of Contents