HoRain云--Swift扩展

张开发
2026/5/5 7:25:04 15 分钟阅读
HoRain云--Swift扩展
HoRain 云小助手个人主页⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。目录⛳️ 推荐Swift 扩展 (Extensions)1. 扩展的基本语法2. 扩展可以为类型添加的功能2.1 添加计算属性2.2 添加方法2.3 添加可变实例方法2.4 添加下标2.5 添加嵌套类型2.6 添加初始化器3. 协议扩展3.1 为协议添加默认实现3.2 为集合类型添加协议扩展4. 为特定类型添加扩展4.1 条件扩展4.2 为可选类型添加扩展5. 扩展中的泛型6. 为 UIKit/AppKit 添加扩展7. 扩展的实际应用示例7.1 日期处理扩展7.2 网络请求扩展8. 扩展的最佳实践8.1 命名规范8.2 组织扩展8.3 注意事项8.4 扩展的适用场景Swift 扩展 (Extensions)扩展是 Swift 中非常强大的特性允许你为现有的类、结构体、枚举或协议添加新功能。这包括添加计算属性、方法、初始化器、下标等。1. 扩展的基本语法// 基本语法 extension SomeType { // 新的功能 } // 扩展协议 extension SomeType: SomeProtocol { // 协议实现 }2. 扩展可以为类型添加的功能2.1 添加计算属性// 扩展 Double 类型 extension Double { // 只读计算属性 var km: Double { return self * 1_000.0 } var m: Double { return self } var cm: Double { return self / 100.0 } var mm: Double { return self / 1_000.0 } var ft: Double { return self / 3.28084 } } let oneInch 25.4.mm print(一英寸是 \(oneInch) 米) // 一英寸是 0.0254 米 let threeFeet 3.ft print(三英尺是 \(threeFeet) 米) // 三英尺是 0.914399970739201 米 // 扩展 Int 类型 extension Int { // 返回数字的绝对值 var absolute: Int { return abs(self) } // 是否是偶数 var isEven: Bool { return self % 2 0 } // 是否是素数 var isPrime: Bool { if self 1 { return false } if self 3 { return true } if self % 2 0 || self % 3 0 { return false } var i 5 while i * i self { if self % i 0 || self % (i 2) 0 { return false } i 6 } return true } // 数字反转 var reversed: Int { let isNegative self 0 var num abs(self) var reversedNum 0 while num 0 { reversedNum reversedNum * 10 num % 10 num / 10 } return isNegative ? -reversedNum : reversedNum } } print(7.isPrime) // true print((-123).reversed) // -321 print(246.isEven) // true2.2 添加方法// 扩展 Int 添加实例方法 extension Int { // 重复执行任务 func repetitions(task: () - Void) { for _ in 0..self { task() } } // 计算阶乘 func factorial() - Int { if self 1 { return 1 } return self * (self - 1).factorial() } // 返回指定范围的随机数 static func random(in range: ClosedRangeInt) - Int { let lower range.lowerBound let upper range.upperBound return lower Int(arc4random_uniform(UInt32(upper - lower 1))) } // 转换为罗马数字 func toRoman() - String? { guard self 0 self 4000 else { return nil } let romanValues [ (1000, M), (900, CM), (500, D), (400, CD), (100, C), (90, XC), (50, L), (40, XL), (10, X), (9, IX), (5, V), (4, IV), (1, I) ] var num self var result for (value, letter) in romanValues { while num value { result letter num - value } } return result } } 3.repetitions { print(Hello!) } // Hello! // Hello! // Hello! print(5.factorial()) // 120 print(Int.random(in: 1...100)) print(2024.toRoman() ?? 无效数字) // MMXXIV // 扩展 String extension String { // 字符串反转 func reversed() - String { return String(self.reversed()) } // 是否包含子字符串 func contains(_ string: String, caseSensitive: Bool true) - Bool { if !caseSensitive { return self.lowercased().contains(string.lowercased()) } return self.contains(string) } // 提取数字 var numbers: [Int] { return self.components(separatedBy: CharacterSet.decimalDigits.inverted) .compactMap { Int($0) } } // 验证邮箱格式 var isValidEmail: Bool { let emailRegex [A-Z0-9a-z._%-][A-Za-z0-9.-]\\.[A-Za-z]{2,} let emailPredicate NSPredicate(format: SELF MATCHES %, emailRegex) return emailPredicate.evaluate(with: self) } // 验证手机号 var isValidPhone: Bool { let phoneRegex ^1[3-9]\\d{9}$ let phonePredicate NSPredicate(format: SELF MATCHES %, phoneRegex) return phonePredicate.evaluate(with: self) } // 首字母大写 func capitalizedWords() - String { return self.components(separatedBy: ) .map { $0.prefix(1).uppercased() $0.dropFirst().lowercased() } .joined(separator: ) } // 生成 MD5 var md5: String { let data Data(self.utf8) let hash data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) - [UInt8] in var hash [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(bytes.baseAddress, CC_LONG(data.count), hash) return hash } return hash.map { String(format: %02x, $0) }.joined() } } let email userexample.com print(email.isValidEmail) // true let text hello world print(text.capitalizedWords()) // Hello World let str abc123def456 print(str.numbers) // [123, 456]2.3 添加可变实例方法结构体和枚举是值类型要修改实例需要标记为mutating// 扩展 Int extension Int { // 平方操作 mutating func square() { self self * self } // 增加指定值 mutating func increment(by value: Int 1) { self value } // 递减 mutating func decrement(by value: Int 1) { self - value } } var someInt 3 someInt.square() // someInt 现在是 9 someInt.increment(by: 5) // 现在是 14 print(someInt) // 14 // 扩展数组 extension Array where Element: Comparable { // 排序原地 mutating func sortAscending() { self.sort(by: ) } mutating func sortDescending() { self.sort(by: ) } // 安全移除元素 mutating func safeRemove(at index: Int) - Element? { guard indices.contains(index) else { return nil } return remove(at: index) } // 去重 mutating func removeDuplicates() { var seen SetElement() self self.filter { seen.insert($0).inserted } } } var numbers [3, 1, 4, 1, 5, 9, 2, 6] numbers.sortAscending() print(numbers) // [1, 1, 2, 3, 4, 5, 6, 9] numbers.removeDuplicates() print(numbers) // [1, 2, 3, 4, 5, 6, 9] // 扩展字符串 extension String { // 去除空格 mutating func trim() { self self.trimmingCharacters(in: .whitespacesAndNewlines) } // 移除所有指定字符 mutating func removeAll(of character: Character) { self self.filter { $0 ! character } } // 追加字符串带可选分隔符 mutating func append(_ string: String, separator: String ) { if !self.isEmpty !separator.isEmpty { self separator } self string } } var text Hello, World! text.trim() print(text) // Hello, World! text.removeAll(of: l) print(text) // Heo, Word! text.append(Swift, separator: , ) print(text) // Heo, Word!, Swift2.4 添加下标// 扩展字符串 extension String { // 通过下标获取字符 subscript(i: Int) - Character? { guard i 0 i count else { return nil } let index self.index(startIndex, offsetBy: i) return self[index] } // 通过范围获取子字符串 subscript(range: RangeInt) - String? { guard range.lowerBound 0 range.upperBound count else { return nil } let start index(startIndex, offsetBy: range.lowerBound) let end index(startIndex, offsetBy: range.upperBound) return String(self[start..end]) } // 通过下标获取子字符串 subscript(range: ClosedRangeInt) - String? { return self[range.lowerBound..range.upperBound 1] } // 安全获取字符 func safeChar(at index: Int) - Character? { return self[index] } } let str Hello, Swift! print(str[0] ?? nil) // H print(str[0..5] ?? nil) // Hello print(str[7...11] ?? nil) // Swift print(str.safeChar(at: 100) ?? nil) // nil // 扩展数组 extension Array { // 安全下标访问 subscript(safe index: Int) - Element? { return indices.contains(index) ? self[index] : nil } // 获取多个索引的元素 subscript(indices: [Int]) - [Element] { var result: [Element] [] for index in indices where index 0 index count { result.append(self[index]) } return result } } let array [1, 2, 3, 4, 5] print(array[safe: 2] ?? 0) // 3 print(array[safe: 10] ?? 0) // 0 print(array[[0, 2, 4]]) // [1, 3, 5]2.5 添加嵌套类型// 扩展 Int extension Int { // 数字类型枚举 enum Kind { case negative, zero, positive } // 数字的种类 var kind: Kind { switch self { case 0: return .zero case let x where x 0: return .positive default: return .negative } } // 数字位数 var digitCount: Int { if self 0 { return 1 } return Int(log10(Double(abs(self)))) 1 } } let number -5 print(number.kind) // negative print(123.digitCount) // 3 // 扩展字符串 extension String { // 字符串格式枚举 enum Format { case uppercase, lowercase, capitalized, reversed } // 根据格式转换字符串 func formatted(as format: Format) - String { switch format { case .uppercase: return self.uppercased() case .lowercase: return self.lowercased() case .capitalized: return self.capitalized case .reversed: return String(self.reversed()) } } } let text Hello World print(text.formatted(as: .uppercase)) // HELLO WORLD print(text.formatted(as: .reversed)) // dlroW olleH2.6 添加初始化器// 扩展自定义结构体 struct Size { var width 0.0 var height 0.0 } struct Point { var x 0.0 var y 0.0 } struct Rect { var origin Point() var size Size() } // 扩展 Rect extension Rect { // 通过中心点和大小创建矩形 init(center: Point, size: Size) { let originX center.x - (size.width / 2) let originY center.y - (size.height / 2) self.init(origin: Point(x: originX, y: originY), size: size) } // 通过角点创建矩形 init(topLeft: Point, bottomRight: Point) { let origin Point(x: min(topLeft.x, bottomRight.x), y: min(topLeft.y, bottomRight.y)) let size Size(width: abs(bottomRight.x - topLeft.x), height: abs(bottomRight.y - topLeft.y)) self.init(origin: origin, size: size) } } let centerRect Rect(center: Point(x: 5, y: 5), size: Size(width: 4, height: 4)) print(centerRect.origin) // Point(x: 3.0, y: 3.0) // 扩展 UIColor import UIKit extension UIColor { // 通过十六进制创建颜色 convenience init(hex: String, alpha: CGFloat 1.0) { var hexSanitized hex.trimmingCharacters(in: .whitespacesAndNewlines) hexSanitized hexSanitized.replacingOccurrences(of: #, with: ) var rgb: UInt64 0 Scanner(string: hexSanitized).scanHexInt64(rgb) let red CGFloat((rgb 0xFF0000) 16) / 255.0 let green CGFloat((rgb 0x00FF00) 8) / 255.0 let blue CGFloat(rgb 0x0000FF) / 255.0 self.init(red: red, green: green, blue: blue, alpha: alpha) } // 随机颜色 static func random() - UIColor { return UIColor( red: CGFloat.random(in: 0...1), green: CGFloat.random(in: 0...1), blue: CGFloat.random(in: 0...1), alpha: 1.0 ) } // 常用颜色 static var systemBlue: UIColor { return UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1) } } let customColor UIColor(hex: #FF5733) let randomColor UIColor.random()3. 协议扩展3.1 为协议添加默认实现// 定义协议 protocol Vehicle { var name: String { get } var currentSpeed: Double { get set } func description() - String } // 协议扩展提供默认实现 extension Vehicle { func description() - String { return 交通工具: \(name), 当前速度: \(currentSpeed) km/h } // 协议扩展可以添加新方法 func makeNoise() { print(发出声音) } } // 遵循协议 struct Car: Vehicle { var name: String var currentSpeed: Double 0.0 var brand: String // 可以重写协议扩展提供的方法 func makeNoise() { print(滴滴) } } struct Bicycle: Vehicle { var name: String var currentSpeed: Double 0.0 var hasBell: Bool true } let myCar Car(name: 我的车, currentSpeed: 60.0, brand: Tesla) let myBike Bicycle(name: 我的自行车, currentSpeed: 15.0) print(myCar.description()) // 交通工具: 我的车, 当前速度: 60.0 km/h myCar.makeNoise() // 滴滴 print(myBike.description()) // 交通工具: 我的自行车, 当前速度: 15.0 km/h myBike.makeNoise() // 发出声音3.2 为集合类型添加协议扩展// 集合协议扩展 extension Collection { // 是否为非空 var isNotEmpty: Bool { return !isEmpty } // 安全获取元素 subscript(safe index: Index) - Element? { return indices.contains(index) ? self[index] : nil } // 打印所有元素 func printAll() { for (index, element) in self.enumerated() { print(索引 \(index): \(element)) } } } let numbers [1, 2, 3, 4, 5] print(numbers.isNotEmpty) // true print(numbers[safe: 2] ?? 0) // 3 print(numbers[safe: 10] ?? 0) // 0 // 数组扩展 extension Array where Element: Comparable { // 查找最大值 var maxValue: Element? { return self.max() } // 查找最小值 var minValue: Element? { return self.min() } // 计算平均值仅限数字 var average: Double? where Element: BinaryInteger { guard !isEmpty else { return nil } return Double(self.reduce(0, )) / Double(count) } var average: Double? where Element: FloatingPoint { guard !isEmpty else { return nil } return Double(self.reduce(0, )) / Double(count) } } let intArray [1, 2, 3, 4, 5] let doubleArray [1.0, 2.0, 3.0, 4.0, 5.0] print(intArray.maxValue ?? 0) // 5 print(intArray.average ?? 0) // 3.0 print(doubleArray.average ?? 0) // 3.04. 为特定类型添加扩展4.1 条件扩展// 只为特定类型添加扩展 extension Array where Element: Numeric { // 求和 func sum() - Element { return self.reduce(0, ) } // 乘积 func product() - Element { return self.reduce(1, *) } } let intNumbers [1, 2, 3, 4, 5] let doubleNumbers [1.1, 2.2, 3.3] print(intNumbers.sum()) // 15 print(intNumbers.product()) // 120 print(doubleNumbers.sum()) // 6.6 // 为 Equatable 元素添加扩展 extension Array where Element: Equatable { // 去重 func unique() - [Element] { var result: [Element] [] for element in self { if !result.contains(element) { result.append(element) } } return result } // 出现次数 func count(of element: Element) - Int { return self.filter { $0 element }.count } // 是否包含所有元素 func containsAll(_ elements: [Element]) - Bool { for element in elements { if !self.contains(element) { return false } } return true } } let array [1, 2, 2, 3, 3, 3, 4] print(array.unique()) // [1, 2, 3, 4] print(array.count(of: 3)) // 3 print(array.containsAll([2, 4])) // true4.2 为可选类型添加扩展// 扩展 Optional extension Optional { // 如果为 nil 则使用默认值 func or(_ defaultValue: Wrapped) - Wrapped { return self ?? defaultValue } // 如果为 nil 则抛出错误 func orThrow(_ errorExpression: autoclosure () - Error) throws - Wrapped { guard let value self else { throw errorExpression() } return value } // 执行闭包如果不为 nil func ifSome(_ closure: (Wrapped) - Void) { if let value self { closure(value) } } // 不为 nil 时执行闭包否则执行另一个闭包 func foldT(ifSome: (Wrapped) - T, ifNone: () - T) - T { if let value self { return ifSome(value) } else { return ifNone() } } } let optionalValue: Int? nil let value optionalValue.or(10) print(value) // 10 let name: String? John name.ifSome { print(Hello, \($0)) } // Hello, John // 使用 fold let result optionalValue.fold( ifSome: { Value is \($0) }, ifNone: { No value } ) print(result) // No value5. 扩展中的泛型// 为序列添加扩展 extension Sequence { // 分组 func groupedT: Hashable(by keyPath: KeyPathElement, T) - [T: [Element]] { return Dictionary(grouping: self, by: { $0[keyPath: keyPath] }) } // 统计 func occurrencesT: Hashable(of keyPath: KeyPathElement, T) - [T: Int] { var counts: [T: Int] [:] for element in self { let key element[keyPath: keyPath] counts[key, default: 0] 1 } return counts } // 去重根据某个属性 func uniqueT: Hashable(by keyPath: KeyPathElement, T) - [Element] { var seen SetT() return self.filter { seen.insert($0[keyPath: keyPath]).inserted } } } struct Person { let name: String let age: Int let city: String } let people [ Person(name: Alice, age: 25, city: New York), Person(name: Bob, age: 30, city: London), Person(name: Charlie, age: 25, city: New York), Person(name: David, age: 30, city: Paris) ] // 按年龄分组 let groupedByAge people.grouped(by: \.age) print(groupedByAge) // 统计城市人数 let cityCounts people.occurrences(of: \.city) print(cityCounts) // [New York: 2, London: 1, Paris: 1] // 去重按城市 let uniqueCities people.unique(by: \.city) print(uniqueCities.map { $0.city }) // [New York, London, Paris]6. 为 UIKit/AppKit 添加扩展import UIKit // 扩展 UIView extension UIView { // 添加阴影 func addShadow(color: UIColor .black, opacity: Float 0.5, offset: CGSize CGSize(width: 0, height: 2), radius: CGFloat 4, cornerRadius: CGFloat 0) { layer.shadowColor color.cgColor layer.shadowOpacity opacity layer.shadowOffset offset layer.shadowRadius radius layer.cornerRadius cornerRadius layer.masksToBounds false } // 添加圆角 func addCornerRadius(_ radius: CGFloat, corners: UIRectCorner .allCorners) { if corners .allCorners { layer.cornerRadius radius layer.masksToBounds true } else { let path UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask CAShapeLayer() mask.path path.cgPath layer.mask mask } } // 添加边框 func addBorder(color: UIColor, width: CGFloat) { layer.borderColor color.cgColor layer.borderWidth width } // 添加渐变背景 func addGradientBackground(colors: [UIColor], startPoint: CGPoint CGPoint(x: 0, y: 0), endPoint: CGPoint CGPoint(x: 1, y: 1)) { let gradient CAGradientLayer() gradient.frame bounds gradient.colors colors.map { $0.cgColor } gradient.startPoint startPoint gradient.endPoint endPoint layer.insertSublayer(gradient, at: 0) } // 添加模糊效果 func addBlurEffect(style: UIBlurEffect.Style .light) { let blurEffect UIBlurEffect(style: style) let blurView UIVisualEffectView(effect: blurEffect) blurView.frame bounds blurView.autoresizingMask [.flexibleWidth, .flexibleHeight] insertSubview(blurView, at: 0) } // 添加点击手势 func addTapGesture(target: Any, action: Selector) { let tapGesture UITapGestureRecognizer(target: target, action: action) addGestureRecognizer(tapGesture) isUserInteractionEnabled true } // 摇动动画 func shake() { let animation CAKeyframeAnimation(keyPath: transform.translation.x) animation.timingFunction CAMediaTimingFunction(name: .linear) animation.duration 0.6 animation.values [-20, 20, -20, 20, -10, 10, -5, 5, 0] layer.add(animation, forKey: shake) } // 淡入淡出 func fadeIn(duration: TimeInterval 0.3) { alpha 0 isHidden false UIView.animate(withDuration: duration) { self.alpha 1 } } func fadeOut(duration: TimeInterval 0.3, completion: (() - Void)? nil) { UIView.animate(withDuration: duration, animations: { self.alpha 0 }) { _ in self.isHidden true completion?() } } } // 扩展 UIButton extension UIButton { // 设置背景颜色 func setBackgroundColor(_ color: UIColor, for state: UIControl.State) { UIGraphicsBeginImageContext(CGSize(width: 1, height: 1)) guard let context UIGraphicsGetCurrentContext() else { return } context.setFillColor(color.cgColor) context.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) let colorImage UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() setBackgroundImage(colorImage, for: state) } // 添加点击动画 func addPressAnimation() { addTarget(self, action: #selector(animateDown), for: [.touchDown, .touchDragEnter]) addTarget(self, action: #selector(animateUp), for: [.touchDragExit, .touchCancel, .touchUpInside]) } objc private func animateDown() { UIView.animate(withDuration: 0.1) { self.transform CGAffineTransform(scaleX: 0.95, y: 0.95) } } objc private func animateUp() { UIView.animate(withDuration: 0.1) { self.transform .identity } } } // 扩展 UIImageView extension UIImageView { // 从 URL 加载图片 func load(from url: URL, placeholder: UIImage? nil) { self.image placeholder URLSession.shared.dataTask(with: url) { data, response, error in guard let data data, let image UIImage(data: data) else { return } DispatchQueue.main.async { self.image image } }.resume() } // 圆形图片 func makeCircular() { layer.cornerRadius min(frame.width, frame.height) / 2 layer.masksToBounds true } }7. 扩展的实际应用示例7.1 日期处理扩展import Foundation extension Date { // 初始化器 init?(year: Int, month: Int, day: Int, hour: Int 0, minute: Int 0, second: Int 0) { var components DateComponents() components.year year components.month month components.day day components.hour hour components.minute minute components.second second let calendar Calendar.current guard let date calendar.date(from: components) else { return nil } self date } // 格式化 func string(format: String yyyy-MM-dd HH:mm:ss) - String { let formatter DateFormatter() formatter.dateFormat format formatter.locale Locale(identifier: zh_CN) return formatter.string(from: self) } // 相对时间描述 var relativeTime: String { let now Date() let interval now.timeIntervalSince(self) if interval 60 { return 刚刚 } else if interval 3600 { return \(Int(interval / 60))分钟前 } else if interval 86400 { return \(Int(interval / 3600))小时前 } else if interval 604800 { return \(Int(interval / 86400))天前 } else { return self.string(format: yyyy-MM-dd) } } // 日期组件 var year: Int { Calendar.current.component(.year, from: self) } var month: Int { Calendar.current.component(.month, from: self) } var day: Int { Calendar.current.component(.day, from: self) } var hour: Int { Calendar.current.component(.hour, from: self) } var minute: Int { Calendar.current.component(.minute, from: self) } var weekday: Int { Calendar.current.component(.weekday, from: self) } var weekOfYear: Int { Calendar.current.component(.weekOfYear, from: self) } // 日期计算 func adding(_ component: Calendar.Component, value: Int) - Date { return Calendar.current.date(byAdding: component, value: value, to: self) ?? self } func startOfDay() - Date { return Calendar.current.startOfDay(for: self) } func endOfDay() - Date { var components DateComponents() components.day 1 components.second -1 return Calendar.current.date(byAdding: components, to: startOfDay()) ?? self } // 日期比较 func isSameDay(as date: Date) - Bool { return Calendar.current.isDate(self, inSameDayAs: date) } func isToday() - Bool { return Calendar.current.isDateInToday(self) } func isYesterday() - Bool { return Calendar.current.isDateInYesterday(self) } func isTomorrow() - Bool { return Calendar.current.isDateInTomorrow(self) } // 日期差 func daysSince(_ date: Date) - Int { let calendar Calendar.current let components calendar.dateComponents([.day], from: date, to: self) return components.day ?? 0 } func age() - Int { let calendar Calendar.current let ageComponents calendar.dateComponents([.year], from: self, to: Date()) return ageComponents.year ?? 0 } } // 使用示例 let now Date() print(now.string(format: yyyy年MM月dd日)) // 2024年12月15日 print(now.relativeTime) // 刚刚 print(now.year) // 2024 print(now.isToday()) // true let yesterday now.adding(.day, value: -1) print(yesterday.isYesterday()) // true7.2 网络请求扩展import Foundation extension URLSession { // 异步获取数据 func data(from url: URL) async throws - (Data, URLResponse) { return try await withCheckedThrowingContinuation { continuation in dataTask(with: url) { data, response, error in if let error error { continuation.resume(throwing: error) } else if let data data, let response response { continuation.resume(returning: (data, response)) } else { continuation.resume(throwing: URLError(.unknown)) } }.resume() } } } extension URL { // 添加查询参数 func appending(queryItems: [URLQueryItem]) - URL? { guard var components URLComponents(url: self, resolvingAgainstBaseURL: false) else { return nil } var currentItems components.queryItems ?? [] currentItems.append(contentsOf: queryItems) components.queryItems currentItems return components.url } } extension Dictionary where Key String, Value Any { // 转换为 URL 查询参数 var queryItems: [URLQueryItem] { return self.map { URLQueryItem(name: $0.key, value: \($0.value)) } } // 转换为 JSON 数据 var jsonData: Data? { return try? JSONSerialization.data(withJSONObject: self, options: []) } }8. 扩展的最佳实践8.1 命名规范// 好的命名 extension String { var isValidEmail: Bool { ... } func toDate(format: String) - Date? { ... } mutating func trim() { ... } } // 避免的命名 extension String { // 不好太宽泛 func process() - String { ... } // 不好与系统方法冲突 func count(of element: Character) - Int { ... } }8.2 组织扩展// 按功能分组 // StringValidation.swift extension String { var isValidEmail: Bool { ... } var isValidPhone: Bool { ... } var isValidPassword: Bool { ... } } // StringFormatting.swift extension String { var capitalizedWords: String { ... } var trimmed: String { ... } func toCamelCase() - String { ... } } // StringEncoding.swift extension String { var base64Encoded: String? { ... } var urlEncoded: String? { ... } var htmlEscaped: String { ... } }8.3 注意事项不能重写已有功能扩展只能添加新功能不能重写现有功能不能添加存储属性只能添加计算属性不能添加属性观察器只能添加计算属性可以添加便利初始化器但不能添加指定初始化器或反初始化器可以添加类型方法包括静态方法和类方法可以添加下标包括只读和读写下标可以添加嵌套类型如枚举、结构体、类8.4 扩展的适用场景添加实用方法为常用类型添加便捷方法协议扩展为协议提供默认实现第三方库集成为第三方类型添加适配器代码组织将相关功能分组到扩展中条件扩展为特定类型添加功能向后兼容在新版本中为旧代码添加功能通过合理使用扩展可以使代码更加清晰、模块化和可维护同时提高开发效率。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧

更多文章