RubifiedSwift 0.9.2

RubifiedSwift 0.9.2

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Jul 2016
SPMSupports SPM

Maintained by Ethan N.



RubifiedSwift

Bunch of Swift extensions for Number, String, Array, Dictionary… written in Ruby-styled implementations.

Inspired by ObjectiveSugar & RubySugar

Usage

Most of Ruby functions are written in 2 common styles: immutable functions in normal way and mutable functions ending with exclaimation mark (!). Unfortunately, in Swift, ! is reserved keyword for unwrapped values. So RubifiedSwift use $ at the end of mutable functions to preserve Ruby style at its best.

Array extensions

var array = [1, 2, 3, 4]

array.at(2)          // 3
array.at(-3)         // 2

array.push(5)               // [1, 2, 3, 4, 5]
array.push(6, 7)            // [1, 2, 3, 4, 5, 6, 7]
array.unshift(0)            // [0, 1, 2, 3, 4, 5, 6, 7]
array.unshift(-2, -1)       // [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]

array.pop()           // 7
array                 // [-2, -1, 0, 1, 2, 3, 4, 5, 6]
array.shift()         // -2
array                 // [-1, 0, 1, 2, 3, 4, 5, 6]

array.join()          // "-10123456"
array.join(" ")       // "-1 0 1 2 3 4 5 6"

array.map$ { $0 * 2 }
array                 // [-2, 0, 2, 4, 6, 8, 10, 12]

array.select { $0 % 3 == 0 }      // [6, 12]
var arr = array
arr.select$ { $0 % 3 == 0 }
arr                               // [6, 12]

array.reject { $0 % 4 == 0 }      // [-2, 2, 6, 10]
arr = array
arr.reject$ { $0 % 4 == 0 }
arr                               // [-2, 2, 6, 10]

arr = array
arr.deleteIf { $0 % 5 == 0 }
arr                               // [-2, 2, 4, 6, 8, 12]

arr = array
arr.keepIf { $0 % 5 == 0 }
arr                               // [0, 10]

[1, 2, 3].permutation()           // [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

array.max()                       // 12
array.min()                       // -2

arr = array
arr.delete(5)                     // nil
arr.delete(2)                     // Optional(2)

arr = [1, 1, 2, 3, 4, 4]
arr.uniq()                       // [1, 2, 3, 4]
arr.uniq$()
arr                              // [1, 2, 3, 4]

[1, 2, 3, 4].eachWithIndex { (element, index) in
  print("\(index). \(element)")
}

[1, 2, 3, 4].mapWithIndex { (element, index) in
  index * element
}                                 // [0, 2, 6, 12]

arr = [1, 2, 3, 4]
arr << 5                          // [1, 2, 3, 4, 5]

[1, 2, 3, 4] | [3, 4, 5, 6]       // [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4] & [3, 4, 5, 6]       // [3, 4]
[1, 2, 3, 4] - [3, 4, 5, 6]       // [1, 2]
[1, 2, 3, 4] ^ [3, 4, 5, 6]       // [1, 2, 5, 6]
[1, 2] * [3, 4]                   // [[1, 3], [1, 4], [2, 3], [2, 4]]
[1, 2] * 3                        // [1, 2, 1, 2, 1, 2]
[1, 2, 3, 4] * ", "               // "1, 2, 3, 4"

[[1, 2, 3], [4, 5, 6]].transpose()  // [[1, 4], [2, 5], [3, 6]]

let sub1 = [4, 5]
let sub2: [Any?] = [8, nil]
let sub3: [Any?] = [nil]
let sub4: [Any?] = [7, sub2, [9], sub3]
var arr: [Any?] = [1, 2, sub1, 6, sub4]

array.unwrapped()                // [1, 2, [4, 5], 6, [Optional(7), Optional([Optional(8), nil]), Optional([9]), Optional([nil])]]
array.deepUnwrapped()            // [1, 2, [4, 5], 6, 7, [9]]

array.compact()                  // [Optional(1), Optional(2), Optional([4, 5]), Optional(6), Optional([Optional(7), Optional([Optional(8), nil]), Optional([9]), Optional([nil])])]
array.deepCompact()              // [Optional(1), Optional(2), Optional([4, 5]), Optional(6), Optional(7), Optional(8), Optional([9])]

["a", "b", "c", "d"].rotate()    // ["b", "c", "d", "a"]
["a", "b", "c", "d"].rotate(-2)  // ["c", "d", "a", "b"]

["a", "b", "c", "d"].sample()    // "c"
["a", "b", "c", "d"].shuffle()   // ["b", "c", "d", "a"]

Number extensions

1.0.abs()         // 1.0
-1.0.abs()        // 1.0

7.seconds()       // 7.0
6.minutes()       // 360.0
5.hours()         // 18000.0
4.days()          // 345600.0
3.weeks()         // 1814400.0
2.months()        // 5184000.0
1.years()         // 31536000.0

3.hours().ago()
3.hours().sinceNow()

let time = 3.hours().ago()
3.hours().until(time)
3.hours().since(time)

5.times()         // [0, 1, 2, 3, 4, 5]
5.times {
  print("Invoke callback")
}

3.upTo(5)         // [3, 4, 5]
3.upTo(5) {
  print("Invoke callback")
}

3.downTo(1)       // [3, 2, 1]
3.downTo(1) {
  print("Invoke callback")
}

1.next()          // 2
1.pred()          // 0

1.abs()           // 1
-1.abs()          // 1

15.toF()           // 15.0
15.toS()           // "15"
75.toS(2)          // "1001011"
75.toS(8)          // "113"
75.toS(16)                        // "4B"
75.toS(16, uppercase: false)      // "4b"

3.isEven()         // false
3.isOdd()          // true

21.gcd(6)          // 3
21.lcm(6)          // 42

String extensions

var str = "Hello, World!"

str.length          // 13
str[1]              // "e"
str[-1]             // "!"
str[1...4]          // "ello"

str.reverse()       // "!dlroW ,olleH"

str.split()         // ["H", "e", "l", "l", "o", ",", " ", "W", "o", "r", "l", "d", "!"]
str.split(", ")     // ["Hello", "World!"]

str.index("l")      // 2

str * 2                   // "Hello, World!Hello, World!"
str << " You're good"     // "Hello, World! You're good"
str << 33                 // "Hello, World! You're good!"

let match: String? = str =~ "\\w+"          // "Hello"
let matches: [String] = str =~ "\\w+"       // ["Hello", "World"]

NSObject extensions

NSObject.performAfter(3) {
  print("Perform after 3 seconds")
}

NSObject.performInBackground({
  print("Perform in background")
}) {
  print("Perform in foreground")
}