Utils.swift 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // Created by jason akakpo on 03/07/16.
  3. // Copyright © 2016 IBAnimatable. All rights reserved.
  4. //
  5. import Foundation
  6. extension Array {
  7. /// Returns the element at the specified index iff it is within bounds, otherwise nil.
  8. subscript(safe index: Int ) -> Element? {
  9. return indices.contains(index) ? self[index] : nil /// Returns the element at the specified index iff it is within bounds, otherwise nil.
  10. }
  11. }
  12. extension String {
  13. func toDouble() -> Double? {
  14. return Double(self)
  15. }
  16. func toFloat() -> Float? {
  17. return Float(self)
  18. }
  19. func toInt() -> Int? {
  20. return Int(self)
  21. }
  22. }
  23. extension RawRepresentable {
  24. init?(raw: RawValue?) {
  25. guard let raw = raw else {
  26. return nil
  27. }
  28. self.init(rawValue: raw)
  29. }
  30. init(raw: RawValue?, defaultValue: Self) {
  31. guard let value = raw else {
  32. self = defaultValue
  33. return
  34. }
  35. self = Self(rawValue: value) ?? defaultValue
  36. }
  37. }
  38. #if swift(>=4.2)
  39. func iterateEnum<T: CaseIterable>(from: T.Type) -> AnyIterator<T> {
  40. return AnyIterator(T.allCases.makeIterator())
  41. }
  42. #else
  43. func iterateEnum<T: Hashable>(from: T.Type) -> AnyIterator<T> {
  44. var x = 0
  45. return AnyIterator {
  46. let next = withUnsafePointer(to: &x) {
  47. $0.withMemoryRebound(to: T.self, capacity: 1) { $0.pointee }
  48. }
  49. defer {
  50. x += 1
  51. }
  52. return next.hashValue == x ? next : nil
  53. }
  54. }
  55. #endif
  56. extension CALayer {
  57. var currentMediaTime: CFTimeInterval {
  58. return convertTime(CACurrentMediaTime(), from: nil)
  59. }
  60. }