RandMyMod

https://github.com/jamesdouble/RandMyMod

RandMyMod берет структуру или класс и создает набор объектов и инициализирует их случайными значениями.

RandMyMod — нативный фреймворк iOS, который помогает вам сгенерировать генерировать одну или множество переменных, на основе вашей модели.
Работает для классов и структур.

Установка

Cocoapods

pod 'RandMyMod'

Базовое использование

— Модель должна быть реализована с протоколом Codable

import RandMyMod

— Создать случайную модель

let instance = MyStruct()
 RandMyMod<MyStruct>().randMe(baseOn: instance) { 
 	(newInstance) in
 	guard let newinstance = newInstance else { print("error"); return }
 }

— Создать множество случайных моделей

 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-генератор фейковых данных

vadymmarkov/Fakery : https://github.com/vadymmarkov/Fakery

Примечание

1. Если переменная класса/структуры объявлена с модификатором

let

rand mod не изменит значение этой переменной

struct MyStruct {
	let nochange: Int = 0
}
let mystruct = MyStruct()
RandMyMod<MyStruct>().randMe(baseOn: mystruct) { (newstruct) in 
	newstruct.nochange  // 0
}

2. Если переменная класса/структуры объявлена с модификатором

Optional

и не имеет значения по умолчанию, то rand mod проигнорирует значение этой переменной и оставит nil.

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
}

Пример

1. Структура/класс с переменной системного типа, ничего особенного:

	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"]
	}

2. Структура/класс с переменной системного типа и специфическим Rand Type:

structstruct  ManMan: : Codable Codable {
    {     varvar name name::  StringString  ==  """"
         varvar age age::  IntInt  ==  4040
         varvar website website:: [ [StringString] ] == []
}

 [] }  extensionextension  ManMan: : RandMyModDelegate RandMyModDelegate {
    
    {          funcfunc  countForArraycountForArray((forfor  keykey: : StringString) ) ->->  IntInt {
         {         switchswitch key {
         key {         casecase  ""websitewebsite""::
                         returnreturn  33
                 defaultdefault::
                         returnreturn  00
        }
    }
    
             }     }          funcfunc  specificRandTypespecificRandType((forfor  keykey: : StringString, , inin  ContainerContainer: : StringString, , withwith  seedseed: RandType) : RandType) ->-> (()  (() ->->  AnyAny))?? {
         {         switchswitch key {
         key {         casecase  ""namename""::
                         returnreturn {  { returnreturn seed. seed.namename..namename() }
        () }         casecase  ""ageage""::
                         returnreturn {  { returnreturn seed. seed.numbernumber..randomIntrandomInt((minmin: : 11, , maxmax: : 6060)}
        )}         casecase  ""websitewebsite""::
                         returnreturn {  { returnreturn seed. seed.internetinternet..urlurl() }
        () }         defaultdefault::
                         returnreturn  nilnil
        }   
    }
}

         }        } }  letlet man  man ==  ManMan()
RandMyMod() RandMyMod<<ManMan>>().().randMerandMe((baseOnbaseOn: man) { (newMan) : man) { (newMan) inin
         guardguard  letlet new  new == newMan  newMan elseelse {  { printprint((""nono""); ); returnreturn }
     }     printprint(new.(new.ageage) 		) 		////3232
         printprint(new.(new.namename) 	) 	////Lavada KrajcikLavada Krajcik
         printprint(new.(new.websitewebsite)	)	////["https://littleohara.name/johathangleason6379", "https://kautzerwunsch.biz/karleejones8880", "https://purdy.net/olivercorkery"]["https://littleohara.name/johathangleason6379", "https://kautzerw 
}

3. Структура/класс с новым объявленным типом и специфическим Rand Type:


structstruct  ManMan: : Codable Codable {
    {     varvar name name::  StringString  ==  """"
         varvar age age::  IntInt  ==  4040
         varvar website website:: [ [StringString] ] == []
     []     varvar child child::  ChildChild  ==  ChildChild()
}

() }  structstruct  ChildChild: : Codable Codable {
    {     varvar name name::  StringString  ==  ""BabyBaby""  ////Baby has no name yet.Baby has no name yet.
         varvar age age::  IntInt  ==  22
         varvar toy toy:: Toys  Toys ==  ToysToys()
}

() }  classclass  ToysToys: : Codable Codable {
    {     varvar weight weight::  DoubleDouble  ==  0.00.0
}

 }  extensionextension  ManMan: : RandMyModDelegate RandMyModDelegate {
    
    {          funcfunc  shouldIgnoreshouldIgnore((forfor  keykey: : StringString, , inin  ContainerContainer: : StringString) ) ->->  BoolBool {
         {         switchswitch (key, Container) {
         (key, Container) {         casecase ( (""namename"",,""childchild""))::
                         returnreturn  truetrue
                 defaultdefault::
                         returnreturn  falsefalse
        }
    }
  
             }     }        funcfunc  specificRandTypespecificRandType((forfor  keykey: : StringString, , inin  ContainerContainer: : StringString, , withwith  seedseed: RandType) : RandType) ->-> (()  (() ->->  AnyAny))?? {
         {         switchswitch (key, Container) {
         (key, Container) {         casecase ( (""ageage"",,""childchild""))::
                         returnreturn {  { returnreturn seed. seed.numbernumber..randomIntrandomInt((minmin: : 11, , maxmax: : 66)}
        )}         casecase ( (""weightweight"",,__))::
                         returnreturn {  { returnreturn seed. seed.numbernumber..randomFloatrandomFloat() }
        () }         defaultdefault::
                         returnreturn  nilnil
        }
    }
}

         }     } }  letlet man  man ==  ManMan()
RandMyMod() RandMyMod<<ManMan>>().().randMerandMe((baseOnbaseOn: man) { (newMan) : man) { (newMan) inin
         guardguard  letlet child  child == newMan newMan??..childchild  elseelse {  { printprint((""nono""); ); returnreturn }
     }     printprint(child.(child.namename)	)	////BabyBaby
         printprint(child.(child.ageage)	)	////33
         printprint(child.(child.toytoy..weightweight)	)	////392.807067871094392.807067871094
 }}

Распространение

Вы вольны делать форки, pull request, открывать тикеты (issue).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *