RandMyMod is an IOS Native Framework helps you generate one or a set of variable base on your own model.
No matter your model is Class / Struct.
- Cocoapods
pod 'RandMyMod'
import RandMyMod
-
Create a Random Model
let instance = MyStruct() RandMyMod<MyStruct>().randMe(baseOn: instance) { (newInstance) in guard let newinstance = newInstance else { print("error"); return } }
-
Create a set of Random Model
let instance = MyStruct() RandMyMod<MyStruct>().randUs(baseOn: instance) { (newInstanceArr) in for newInstance in newInstanceArr { guard let newinstance = newInstance else { print("error"); return } } }
-
RandMyModDelegate
public protocol RandMyModDelegate { func countForArray(for key: String) -> Int func shouldIgnore(for key: String, in Container: String) -> Bool func catchError(with errorStr: String) func specificRandType(for key: String, in Container: String, with seed: RandType) -> (()->Any)? }
-
Swift fake data generator
vadymmarkov/Fakery : https://github.com/vadymmarkov/Fakery
-
if the variable in class / stuct is Declared with 『 let 』 , rand mod will not change this variable's value.
struct MyStruct { let nochange: Int = 0 } let mystruct = MyStruct() RandMyMod<MyStruct>().randMe(baseOn: mystruct) { (newstruct) in newstruct.nochange // 0 }
-
if the variable in class / stuct is Declared with 『 Optional 』 and have no initial Value , rand mod will ignore this variable's value and keep it nil. (Mirror may resolve this issue, may fix in the future)
struct MyStruct { var opt: Int? = 0 var opt2: Int? } let mystruct = MyStruct() RandMyMod<MyStruct>().randMe(baseOn: mystruct) { (newstruct) in mystruct.opt // 4242 mystruct.opt2 // nil }
class Man: Codable {
var name: String = ""
var address: String = ""
var website: [String] = []
}
let man = Man()
RandMyMod<Man>().randMe(baseOn: man) { (newMan) in
guard let new = newMan else { return }
print(new.address) //mnxvpkalug
print(new.name) //iivjohpggb
print(new.website) //["pbmsualvei", "vlqhlwpajf", "npgtxdmfyt"]
}
struct Man: Codable {
var name: String = ""
var age: Int = 40
var website: [String] = []
}
extension Man: RandMyModDelegate {
func countForArray(for key: String) -> Int {
switch key {
case "website":
return 3
default:
return 0
}
}
func specificRandType(for key: String, in Container: String, with seed: RandType) -> (() -> Any)? {
switch key {
case "name":
return { return seed.name.name() }
case "age":
return { return seed.number.randomInt(min: 1, max: 60)}
case "website":
return { return seed.internet.url() }
default:
return nil
}
}
}
let man = Man()
RandMyMod<Man>().randMe(baseOn: man) { (newMan) in
guard let new = newMan else { print("no"); return }
print(new.age) //32
print(new.name) //Lavada Krajcik
print(new.website) //["https://littleohara.name/johathangleason6379", "https://kautzerwunsch.biz/karleejones8880", "https://purdy.net/olivercorkery"]
}
struct Man: Codable {
var name: String = ""
var age: Int = 40
var website: [String] = []
var child: Child = Child()
}
struct Child: Codable {
var name: String = "Baby" //Baby has no name yet.
var age: Int = 2
var toy: Toys = Toys()
}
class Toys: Codable {
var weight: Double = 0.0
}
extension Man: RandMyModDelegate {
func shouldIgnore(for key: String, in Container: String) -> Bool {
switch (key, Container) {
case ("name","child"):
return true
default:
return false
}
}
func specificRandType(for key: String, in Container: String, with seed: RandType) -> (() -> Any)? {
switch (key, Container) {
case ("age","child"):
return { return seed.number.randomInt(min: 1, max: 6)}
case ("weight",_):
return { return seed.number.randomFloat() }
default:
return nil
}
}
}
let man = Man()
RandMyMod<Man>().randMe(baseOn: man) { (newMan) in
guard let child = newMan?.child else { print("no"); return }
print(child.name) //Baby
print(child.age) //3
print(child.toy.weight) //392.807067871094
}
Feel free to fork / pull request / open an issue.