Skip to content
This repository was archived by the owner on Feb 2, 2022. It is now read-only.

Commit 4e9fedc

Browse files
authored
Merge pull request #55 from nodes-ios/feature/String_Initializable
added StringInitializable from NStack
2 parents 0a997c4 + 2a1f465 commit 4e9fedc

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

Codemine.xcodeproj/project.pbxproj

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@
6363
293490EE1C6CAFD500E8305E /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490ED1C6CAFD500E8305E /* Application.swift */; };
6464
293490F01C6CAFF200E8305E /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490EF1C6CAFF200E8305E /* Then.swift */; };
6565
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */; };
66+
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
67+
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
68+
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
69+
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
70+
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
71+
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
72+
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
73+
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
6674
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
6775
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
6876
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
@@ -135,6 +143,8 @@
135143
293490ED1C6CAFD500E8305E /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
136144
293490EF1C6CAFF200E8305E /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = "<group>"; };
137145
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchTime+Utilities.swift"; sourceTree = "<group>"; };
146+
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extensions+StringInitializable.swift"; sourceTree = "<group>"; };
147+
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extention+HexInitializable.swift"; sourceTree = "<group>"; };
138148
42FB12122063D04900F850D1 /* URLSession+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSession+Codable.swift"; sourceTree = "<group>"; };
139149
838A0F961F03F57E00469143 /* String+HTML.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+HTML.swift"; sourceTree = "<group>"; };
140150
83A5BEBB1D981F3500C74312 /* UIImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageTests.swift; sourceTree = "<group>"; };
@@ -267,6 +277,8 @@
267277
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */,
268278
838A0F961F03F57E00469143 /* String+HTML.swift */,
269279
42FB12122063D04900F850D1 /* URLSession+Codable.swift */,
280+
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */,
281+
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */,
270282
);
271283
path = Extensions;
272284
sourceTree = "<group>";
@@ -583,8 +595,10 @@
583595
buildActionMask = 2147483647;
584596
files = (
585597
01CD40881D071BDC0044887E /* CGRect+Utilities.swift in Sources */,
598+
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
586599
01CD40891D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
587600
01CD40631D071BCB0044887E /* Then.swift in Sources */,
601+
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
588602
01CD40851D071BDC0044887E /* String+CaseConverter.swift in Sources */,
589603
01CD408A1D071BDC0044887E /* NSError+Utilities.swift in Sources */,
590604
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */,
@@ -612,6 +626,7 @@
612626
01CD407F1D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
613627
01CD40831D071BDC0044887E /* UIImage+Utilities.swift in Sources */,
614628
01CD40821D071BDC0044887E /* NSURL+Utilities.swift in Sources */,
629+
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
615630
01CD40671D071BCC0044887E /* Then.swift in Sources */,
616631
01CD407B1D071BDC0044887E /* String+CaseConverter.swift in Sources */,
617632
01CD40801D071BDC0044887E /* NSError+Utilities.swift in Sources */,
@@ -621,6 +636,7 @@
621636
01CD407D1D071BDC0044887E /* String+EmailValidation.swift in Sources */,
622637
01CD40661D071BCC0044887E /* Application.swift in Sources */,
623638
01CD407C1D071BDC0044887E /* String+Range.swift in Sources */,
639+
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
624640
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */,
625641
);
626642
runOnlyForDeploymentPostprocessing = 0;
@@ -642,7 +658,9 @@
642658
01CD40751D071BDB0044887E /* CGPoint+Utilities.swift in Sources */,
643659
01CD40791D071BDB0044887E /* UIImage+Utilities.swift in Sources */,
644660
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */,
661+
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
645662
01CD406B1D071BCC0044887E /* Then.swift in Sources */,
663+
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
646664
01CD40711D071BDB0044887E /* String+CaseConverter.swift in Sources */,
647665
01CD40761D071BDB0044887E /* NSError+Utilities.swift in Sources */,
648666
01CD40771D071BDB0044887E /* UIColor+Hex.swift in Sources */,
@@ -663,6 +681,7 @@
663681
291272BB1C75EC2C00FB1BBD /* String+Range.swift in Sources */,
664682
291272C91C75EE9A00FB1BBD /* NSURL+Utilities.swift in Sources */,
665683
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */,
684+
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
666685
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */,
667686
291272C31C75EDE300FB1BBD /* CGRect+Utilities.swift in Sources */,
668687
291272CB1C75EEB500FB1BBD /* UIImage+Utilities.swift in Sources */,
@@ -672,6 +691,7 @@
672691
293490F01C6CAFF200E8305E /* Then.swift in Sources */,
673692
0132B4CF1C70E616007BC588 /* NSError+Utilities.swift in Sources */,
674693
291272C11C75ED3900FB1BBD /* UIColor+Hex.swift in Sources */,
694+
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
675695
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */,
676696
);
677697
runOnlyForDeploymentPostprocessing = 0;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// Extensions.swift
3+
// Serializable
4+
//
5+
// Created by Chris Combs on 16/02/16.
6+
// Copyright © 2016 Nodes. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: - Protocols -
12+
// MARK: String Initializable
13+
14+
public protocol StringInitializable {
15+
static func fromString<T>(_ string: String) -> T?
16+
func stringRepresentation() -> String
17+
}
18+
19+
extension URL: StringInitializable {
20+
public static func fromString<T>(_ string: String) -> T? {
21+
return self.init(string: string) as? T
22+
}
23+
24+
public func stringRepresentation() -> String {
25+
return self.absoluteString
26+
}
27+
}
28+
29+
extension Date: StringInitializable {
30+
static fileprivate let internalDateFormatter = DateFormatter()
31+
static fileprivate let allowedDateFormats = ["yyyy-MM-dd'T'HH:mm:ssZZZZZ", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd"]
32+
static public var customDateFormats: [String] = []
33+
34+
public static func fromString<T>(_ string: String) -> T? {
35+
for format in allowedDateFormats + customDateFormats {
36+
internalDateFormatter.dateFormat = format
37+
if let date = internalDateFormatter.date(from: string) as? T {
38+
return date
39+
}
40+
}
41+
42+
return nil
43+
}
44+
45+
public func stringRepresentation() -> String {
46+
Date.internalDateFormatter.dateFormat = Date.allowedDateFormats.first
47+
return Date.internalDateFormatter.string(from: self)
48+
}
49+
}
50+
51+
52+
53+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// Extention+HexInitializable.swift
3+
// Codemine
4+
//
5+
// Created by Andrei Hogea on 27/03/2018.
6+
// Copyright © 2018 Nodes. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: Hex Initializable
12+
#if os(OSX)
13+
import Cocoa
14+
typealias Color = NSColor
15+
#else
16+
import UIKit
17+
typealias Color = UIColor
18+
#endif
19+
20+
public protocol HexInitializable {
21+
static func fromHexString<T>(_ hexString: String) -> T?
22+
}
23+
24+
extension Color: HexInitializable {
25+
26+
public static func fromHexString<T>(_ hexString: String) -> T? {
27+
let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
28+
var int = UInt32()
29+
let a, r, g, b: UInt32
30+
31+
guard Scanner(string: hex).scanHexInt32(&int) else {
32+
return nil
33+
}
34+
35+
switch hex.count {
36+
// RGB (12-bit)
37+
case 3:
38+
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
39+
// RRGGBB (24-bit)
40+
case 6:
41+
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
42+
// ARGB (32-bit)
43+
case 8:
44+
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
45+
default:
46+
return nil
47+
}
48+
49+
return self.init(red: CGFloat(r) / 255,
50+
green: CGFloat(g) / 255,
51+
blue: CGFloat(b) / 255,
52+
alpha: CGFloat(a) / 255) as? T
53+
}
54+
}

0 commit comments

Comments
 (0)