95 lines
3.1 KiB
Swift
95 lines
3.1 KiB
Swift
//
|
||
// Foundation+.swift
|
||
// 常规扩展
|
||
//
|
||
// Created by CC-star on 2025/6/29.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
|
||
//以1开头,再加10个数字【\d】(\\d -> 转义字符\ -> \d),并以数字结尾
|
||
let kPhoneRegEx = "^1\\d{10}$"//中国手机号正则表达式
|
||
|
||
let kVerCodeRegEx = "^\\d{6}$"//验证码正则表达式
|
||
extension NSRegularExpression {
|
||
convenience init(_ pattern: String) {
|
||
do {
|
||
try self.init(pattern: pattern)
|
||
} catch {
|
||
fatalError("非法的正则表达式")//因不能确保调用父类的init函数
|
||
}
|
||
}
|
||
func matches(_ string: String) -> Bool {
|
||
let range = NSRange(location: 0, length: string.utf16.count)
|
||
return firstMatch(in: string, options: [], range: range) != nil
|
||
}
|
||
}
|
||
|
||
extension String {
|
||
var isBlank: Bool { self.isEmpty || self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty }//没有输入或者输入空格
|
||
var trimmed: String { self.trimmingCharacters(in: .whitespacesAndNewlines) }
|
||
var isPhoneNum: Bool {
|
||
Int(self) != nil && NSRegularExpression(kPhoneRegEx).matches(self)
|
||
//判断该字符串是否可以转化为int类型 nor 置空 -> 判断用户是否输入的是数字
|
||
}
|
||
var isVerCode: Bool { Int(self) != nil && NSRegularExpression(kVerCodeRegEx).matches(self) }
|
||
//随机字母和数字组合
|
||
static func randomString(_ length: Int) -> String{
|
||
let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||
return String((0..<length).map{ _ in letters.randomElement()! })
|
||
}
|
||
}
|
||
|
||
extension Date {
|
||
var daysFromNow: Int {
|
||
Calendar.current.dateComponents([.day], from: self, to: .now).day ?? 0//??空合运算符
|
||
}
|
||
|
||
|
||
// let date = Date()
|
||
// print(date.string(withFormat: "yyyy/MM/dd HH:mm")) // 2023/08/24 16:21
|
||
// print(date.string(withFormat: "yyyy/MM/dd hh:mm")) // 2023/08/24 04:21
|
||
var toStr: String {
|
||
let year = Calendar.current.component(.year, from: self)
|
||
let currentYear = Calendar.current.component(.year, from: Date())
|
||
let dateFormatter = DateFormatter()
|
||
dateFormatter.dateFormat = (year == currentYear) ? "M-d" : "yyyy-M-d"
|
||
return dateFormatter.string(from: self)
|
||
}
|
||
}
|
||
|
||
enum UserError: String, Error {
|
||
case lcObjToDicError = "lc对象转换字典失败"
|
||
case saveFileSuccessButNoURL = "保存文件成功,但未能获取文件的地址"
|
||
case imageToheicDataError = "图片转换成heicData失败"
|
||
case imageTooBig = "图片太大"
|
||
case objectIdNotFound = "没找到objectId"
|
||
}
|
||
|
||
enum NetworkError: Error {
|
||
case invalidURL
|
||
case notHTTPResponse
|
||
case requestFailed(String)//枚举关联值
|
||
}
|
||
|
||
|
||
extension NetworkError: LocalizedError {//扩展NetworkError的中文提示
|
||
var errorDescription: String? {
|
||
switch self {
|
||
case .invalidURL:
|
||
return "请求的网址错误"
|
||
case .notHTTPResponse:
|
||
return "响应不能转化为HTTPURLResponse"
|
||
case .requestFailed(let errorMsg):
|
||
return "请求失败:\(errorMsg)"
|
||
}
|
||
}
|
||
}
|
||
|
||
extension Notification.Name {
|
||
static let loginSuccess = Notification.Name("loginSuccess")
|
||
static let logoutSuccess = Notification.Name("logoutSuccess")
|
||
}
|
||
|