ConvenienceExtensions.swift 985 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import UIKit
  2. protocol Occupiable {
  3. var isEmpty: Bool { get }
  4. var isNotEmpty: Bool { get }
  5. var nonEmpty: Self? { get }
  6. }
  7. // Give a default implementation of isNotEmpty, so conformance only requires one implementation
  8. extension Occupiable {
  9. var isNotEmpty: Bool {
  10. !isEmpty
  11. }
  12. var nonEmpty: Self? {
  13. isEmpty ? nil : self
  14. }
  15. }
  16. extension String: Occupiable {}
  17. extension Array: Occupiable {}
  18. extension ArraySlice: Occupiable {}
  19. extension CGRect: Occupiable {}
  20. extension Data: Occupiable {}
  21. extension Dictionary: Occupiable {}
  22. extension Set: Occupiable {}
  23. // Extend the idea of occupiability to optionals. Specifically, optionals wrapping occupiable things.
  24. extension Optional where Wrapped: Occupiable {
  25. var isNilOrEmpty: Bool {
  26. switch self {
  27. case .none:
  28. return true
  29. case let .some(value):
  30. return value.isEmpty
  31. }
  32. }
  33. var isNotNilNotEmpty: Bool {
  34. !isNilOrEmpty
  35. }
  36. }