-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding some helpful string extensions
- Loading branch information
Erik Sargent
committed
May 17, 2017
1 parent
ac3de60
commit 078ff4a
Showing
4 changed files
with
159 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// | ||
// StringTests.swift | ||
// LKAPI | ||
// | ||
// Created by Erik Sargent on 5/17/17. | ||
// Copyright © 2017 CocoaPods. All rights reserved. | ||
// | ||
|
||
import XCTest | ||
|
||
|
||
class StringTests: XCTestCase { | ||
let camel = "thisIsWonderfulCamelCase" | ||
let snakedCamel = "this_is_wonderful_camel_case" | ||
|
||
let SuperCamel = "ThisIsWonderfulCamelCase" | ||
let snakedSuperCamel = "this_is_wonderful_camel_case" | ||
|
||
let snake = "this_is_horrible_snake_case" | ||
let cameledSnake = "thisIsHorribleSnakeCase" | ||
|
||
let capitalSnake = "This_Is_Horrible_Snake_Case" | ||
let cameledCapitalSnake = "ThisIsHorribleSnakeCase" | ||
|
||
let spaced = "this is what we are used to" | ||
let blank = "" | ||
let emoji = "😀_😃" | ||
let cameledEmoji = "😀😃" | ||
|
||
let kata = "カ_ヌ" | ||
let cameledKata = "カヌ" | ||
|
||
let accented = "résumé" | ||
|
||
let date = "2017-04-03" | ||
let dateTime = "2017-5-4T02:40:90" | ||
let dateTimeZ = "2017-5-4T02:40:90Z" | ||
let dateTimeZone = "2017-5-4T02:40:90-0700" | ||
let dateGarbage = "2017-5-4stuff" | ||
let dateTimeGarbage = "2017-5-4T02:40:90Stuff" | ||
|
||
|
||
func testToCamel() { | ||
XCTAssertEqual(camel.toCamel, camel) | ||
XCTAssertEqual(SuperCamel.toCamel, SuperCamel) | ||
XCTAssertEqual(snake.toCamel, cameledSnake) | ||
XCTAssertEqual(capitalSnake.toCamel, cameledCapitalSnake) | ||
XCTAssertEqual(spaced.toCamel, spaced) | ||
XCTAssertEqual(blank.toCamel, blank) | ||
XCTAssertEqual(emoji.toCamel, cameledEmoji) | ||
XCTAssertEqual(kata.toCamel, cameledKata) | ||
XCTAssertEqual(accented.toCamel, accented) | ||
} | ||
|
||
func testToSnake() { | ||
XCTAssertEqual(camel.toSnake, snakedCamel) | ||
XCTAssertEqual(SuperCamel.toSnake, snakedSuperCamel) | ||
XCTAssertEqual(snake.toSnake, snake) | ||
XCTAssertEqual(capitalSnake.toSnake, capitalSnake.lowercased()) | ||
XCTAssertEqual(spaced.toSnake, spaced) | ||
XCTAssertEqual(blank.toSnake, blank) | ||
XCTAssertEqual(emoji.toSnake, emoji) | ||
XCTAssertEqual(kata.toSnake, kata) | ||
XCTAssertEqual(accented.toSnake, accented) | ||
} | ||
|
||
func testIsDate() { | ||
XCTAssertTrue(date.isDate) | ||
XCTAssertFalse(dateTime.isDate) | ||
XCTAssertFalse(dateTimeZ.isDate) | ||
XCTAssertFalse(dateTimeZone.isDate) | ||
XCTAssertFalse(dateGarbage.isDate) | ||
XCTAssertFalse(dateTimeGarbage.isDate) | ||
} | ||
|
||
func testIsDateTime() { | ||
XCTAssertFalse(date.isDateTime) | ||
XCTAssertTrue(dateTime.isDateTime) | ||
XCTAssertTrue(dateTimeZ.isDateTime) | ||
XCTAssertTrue(dateTimeZone.isDateTime) | ||
XCTAssertFalse(dateGarbage.isDateTime) | ||
XCTAssertFalse(dateTimeGarbage.isDateTime) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// | ||
// String.swift | ||
// Pods | ||
// | ||
// Created by Erik Sargent on 5/17/17. | ||
// | ||
// | ||
|
||
import Foundation | ||
|
||
|
||
extension String { | ||
public var toCamel: String { | ||
let comps = self.components(separatedBy: "_") | ||
let notFirst = comps.dropFirst() | ||
|
||
guard !comps.isEmpty else { | ||
return "" | ||
} | ||
|
||
var value = comps.first! | ||
|
||
notFirst.forEach { comp in | ||
value += comp.capitalized | ||
} | ||
|
||
return value | ||
} | ||
|
||
public var toSnake: String { | ||
var value = self | ||
|
||
while true { | ||
if let range = value.rangeOfCharacter(from: .uppercaseLetters) { | ||
var letter = value.substring(with: range).lowercased() | ||
if value.distance(from: value.startIndex, to: range.lowerBound) > 0 && !value.substring(with: value.index(before: range.lowerBound)..<range.upperBound).contains("_") { | ||
letter = "_" + letter | ||
} | ||
value.replaceSubrange(range, with: letter) | ||
} else { | ||
break | ||
} | ||
} | ||
|
||
return value | ||
} | ||
|
||
public var isDate: Bool { | ||
guard let regex = try? NSRegularExpression(pattern: "^\\d{1,4}-\\d{1,2}-\\d{1,2}$", options: []) else { | ||
return false | ||
} | ||
|
||
let matches = regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.characters.count)) | ||
|
||
return matches.count > 0 | ||
} | ||
|
||
public var isDateTime: Bool { | ||
guard let regex = try? NSRegularExpression(pattern: "^\\d{1,4}-\\d{1,2}-\\d{1,2}T\\d\\d:\\d\\d:\\d\\d(Z|-\\d\\d\\d\\d)?$", options: []) else { | ||
return false | ||
} | ||
|
||
let matches = regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.characters.count)) | ||
|
||
return matches.count > 0 | ||
} | ||
} |