-
-
Save hyuni/c73e0b0f579d538df20e to your computer and use it in GitHub Desktop.
Swift Extensions
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
import Foundation | |
extension String { | |
var length: Int { | |
return (self as NSString).length | |
} | |
func split(separator: Character) -> [String] { | |
return self.characters.split { $0 == separator }.map(String.init) | |
} | |
func split(maxSplit: Int = Int.max, separator: Character) -> [String] { | |
return self.characters.split(maxSplit) { $0 == separator }.map(String.init) | |
} | |
func split(regex: NSRegularExpression) -> [String] { | |
var segments: [String] = [] | |
let stringAsNS = self as NSString | |
let results = regex.matchesInString(self, options: NSMatchingOptions(rawValue: 0), range: NSRange(location:0, length:self.characters.count)) | |
var offset = 0 | |
for result in results { | |
if result.range.location > offset { | |
segments.append(stringAsNS.substringWithRange(NSRange(location: offset, length: result.range.location - offset))) | |
} | |
segments.append(stringAsNS.substringWithRange(NSRange(location: result.range.location, length: result.range.length))) | |
offset = result.range.location + result.range.length | |
} | |
return segments | |
} | |
func replace(old: Character, new: Character) -> String { | |
var buffer = [Character]() | |
self.characters.forEach { buffer.append($0 == old ? new : $0) } | |
return String(buffer) | |
} | |
func unquote() -> String { | |
var scalars = self.unicodeScalars; | |
if scalars.first == "\"" && scalars.last == "\"" && scalars.count >= 2 { | |
scalars.removeFirst(); | |
scalars.removeLast(); | |
return String(scalars) | |
} | |
return self | |
} | |
func trim(chars: String = "") -> String { | |
let sets = NSMutableCharacterSet.whitespaceAndNewlineCharacterSet() | |
sets.addCharactersInString(chars) | |
return self.stringByTrimmingCharactersInSet(sets) | |
} | |
func rtrim(charsets: String = "") -> String { | |
var sets = charsets | |
var chars = self.characters | |
sets.appendContentsOf("\u{020}\u{009}\u{00A}\u{00D}\u{000}\u{00B}") | |
while let last = chars.last where sets.characters.contains(last) { | |
chars.removeLast() | |
} | |
return String(chars) | |
} | |
func ltrim(charsets: String = "") -> String { | |
var sets = charsets | |
var chars = self.characters | |
sets.appendContentsOf("\u{020}\u{009}\u{00A}\u{00D}\u{000}\u{00B}") | |
while let first = chars.first where charsets.characters.contains(first) { | |
chars.removeFirst() | |
} | |
return String(chars) | |
} | |
static func fromUInt8(array: [UInt8]) -> String { | |
#if os(Linux) | |
return String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) ?? "" | |
#else | |
if let s = String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) { | |
return s | |
} | |
return "" | |
#endif | |
} | |
func removePercentEncoding() -> String { | |
var scalars = self.unicodeScalars | |
var output = "" | |
var bytesBuffer = [UInt8]() | |
while let scalar = scalars.popFirst() { | |
if scalar == "%" { | |
let first = scalars.popFirst() | |
let secon = scalars.popFirst() | |
if let first = unicodeScalarToUInt32Hex(first), secon = unicodeScalarToUInt32Hex(secon) { | |
bytesBuffer.append(first*16+secon) | |
} else { | |
if !bytesBuffer.isEmpty { | |
output.appendContentsOf(String.fromUInt8(bytesBuffer)) | |
bytesBuffer.removeAll() | |
} | |
if let first = first { output.append(Character(first)) } | |
if let secon = secon { output.append(Character(secon)) } | |
} | |
} else { | |
if !bytesBuffer.isEmpty { | |
output.appendContentsOf(String.fromUInt8(bytesBuffer)) | |
bytesBuffer.removeAll() | |
} | |
output.append(Character(scalar)) | |
} | |
} | |
if !bytesBuffer.isEmpty { | |
output.appendContentsOf(String.fromUInt8(bytesBuffer)) | |
bytesBuffer.removeAll() | |
} | |
return output | |
} | |
private func unicodeScalarToUInt32Whitespace(x: UnicodeScalar?) -> UInt8? { | |
if let x = x { | |
if x.value >= 9 && x.value <= 13 { | |
return UInt8(x.value) | |
} | |
if x.value == 32 { | |
return UInt8(x.value) | |
} | |
} | |
return nil | |
} | |
private func unicodeScalarToUInt32Hex(x: UnicodeScalar?) -> UInt8? { | |
if let x = x { | |
if x.value >= 48 && x.value <= 57 { | |
return UInt8(x.value) - 48 | |
} | |
if x.value >= 97 && x.value <= 102 { | |
return UInt8(x.value) - 87 | |
} | |
if x.value >= 65 && x.value <= 70 { | |
return UInt8(x.value) - 55 | |
} | |
} | |
return nil | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment