Skip to content

Instantly share code, notes, and snippets.

@ulkomar
Created July 17, 2023 21:13
Show Gist options
  • Save ulkomar/f981f2eee77c3bc46269ea615942ddd7 to your computer and use it in GitHub Desktop.
Save ulkomar/f981f2eee77c3bc46269ea615942ddd7 to your computer and use it in GitHub Desktop.
enum TreeType: String, CaseIterable {
case oak = "Oak"
case birch = "Birch"
case aspen = "Aspen"
}
final class Tree {
let leafColor: UIColor
let leafImage: UIImage
let rootColor: UIColor
let rootImage: UIImage
let height: Int
let treeType: TreeType
init(leafColor: UIColor, leafImage: UIImage, rootColor: UIColor, rootImage: UIImage, height: Int, treeType: TreeType) {
self.leafColor = leafColor
self.leafImage = leafImage
self.rootColor = rootColor
self.rootImage = rootImage
self.treeType = treeType
self.height = height
}
}
final class TreeSprite {
let leafColor: UIColor
let leafImage: UIImage
let rootColor: UIColor
let rootImage: UIImage
let treeType: TreeType
init(leafColor: UIColor, leafImage: UIImage, rootColor: UIColor, rootImage: UIImage, treeType: TreeType) {
self.leafColor = leafColor
self.leafImage = leafImage
self.rootColor = rootColor
self.rootImage = rootImage
self.treeType = treeType
}
func checkMemoryIndex() {
// Просто проверяем по какому индексу в памяти находится объект
let memoryAddress = Unmanaged<TreeSprite>.passUnretained(self).toOpaque()
print(memoryAddress)
}
}
final class TreeFactory {
// Store of all sprites
static var spriteTree = [TreeType:TreeSprite]()
// Factory of creating a new sprite
static func getSpriteTree(of type: TreeType) -> TreeSprite {
if let tree = spriteTree[type] {
return tree
} else {
var tree: TreeSprite
switch type {
case .oak:
tree = TreeSprite(leafColor: .black, leafImage: .init(), rootColor: .black, rootImage: .init(), treeType: .oak)
case .birch:
tree = TreeSprite(leafColor: .green, leafImage: .init(), rootColor: .brown, rootImage: .init(), treeType: .birch)
case .aspen:
tree = TreeSprite(leafColor: .lightGray, leafImage: .init(), rootColor: .brown, rootImage: .init(), treeType: .birch)
}
spriteTree[type] = tree
return tree
}
}
}
final class ConcreteTree {
let height: Int
let sprite: TreeSprite
init(height: Int, treeSprite: TreeSprite) {
self.height = height
self.sprite = treeSprite
}
func checkSpriteIndex() {
sprite.checkMemoryIndex()
}
}
final class TreeManager {
func create1000LightTrees() {
var allTrees = [ConcreteTree]()
for index in 1...1000 {
let randomCase = TreeType.allCases.randomElement()
let spriteTree = TreeFactory.getSpriteTree(of: randomCase!)
let tree = ConcreteTree(height: index + 1000, treeSprite: spriteTree)
tree.checkSpriteIndex()
allTrees.append(tree)
}
print(self.size(allTrees))
}
func create1000SimpleTrees() {
var allTrees = [Tree]()
for index in 1...1000 {
let randomCase = TreeType.allCases.randomElement()
let tree = Tree(leafColor: .green, leafImage: .init(), rootColor: .brown, rootImage: .init(), height: index + 1000, treeType: randomCase!)
allTrees.append(tree)
}
print(self.size(allTrees))
}
private func size<T: AnyObject>(_ array: [T]) -> Int {
return class_getInstanceSize(T.self) * array.count
}
}
let treeManager = TreeManager()
treeManager.create1000LightTrees()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment