Skip to content

Instantly share code, notes, and snippets.

View achernoprudov's full-sized avatar
🏠
Working from home

Andrei Chernoprudov achernoprudov

🏠
Working from home
View GitHub Profile
UIMenu {
UIAction(title: "Open", image: UIImage(systemName: "xmark.octagon")) { _ in
...
}
UIMenu(title: "Edit") {
if item.isHidden {
UIAction(title: "Show", image: UIImage(systemName: "eye")) { _ in
...
}
} else {
@achernoprudov
achernoprudov / MenuElementsBuilder.swift
Last active July 27, 2021 12:13
Final implementation of the MenuElementsBuilder result builder
@resultBuilder
enum MenuElementsBuilder {
static func buildBlock(_ elements: [UIMenuElement]...) -> [UIMenuElement] {
return elements.flatMap { $0 }
}
static func buildExpression(_ element: UIMenuElement) -> [UIMenuElement] {
return [element]
}
@resultBuilder
enum MenuElementsBuilder {
static func buildExpression(_ element: UIMenuElement) -> [UIMenuElement] {
return [element]
}
static func buildBlock(_ elements: [UIMenuElement]...) -> [UIMenuElement] {
return elements.flatMap { $0 }
}
@achernoprudov
achernoprudov / UIMenu+BuildOptional.swift
Created July 27, 2021 11:24
Build optional function for Menu result builder
static func buildOptional(_ elements: [UIMenuElement]?) -> [UIMenuElement] {
return elements ?? []
}
UIMenu {
UIAction(title: "Open", image: UIImage(systemName: "xmark.octagon")) { _ in
...
}
UIMenu(title: "Edit") {
item.isHidden
? UIAction(title: "Show", image: UIImage(systemName: "eye")) { _ in
...
}
: UIAction(title: "Hide", image: UIImage(systemName: "eye.slash")) { _ in
@achernoprudov
achernoprudov / UIMenu+Build.swift
Last active November 2, 2021 08:23
UIMenu extension with primitive result builder
@resultBuilder
enum MenuElementsBuilder {
static func buildBlock(_ elements: UIMenuElement...) -> [UIMenuElement] {
return elements
}
}
extension UIMenu {
convenience init(_ title: String = "", @MenuElementsBuilder builder: () -> [UIMenuElement]) {
self.init(title: title, children: builder())
@achernoprudov
achernoprudov / UIMenu-build-final.swift
Created July 27, 2021 11:02
Building UIMenu with DSL
UIMenu {
UIAction("Open", icon "xmark.octagon") { _ in
...
}
UIMenu(title: "Edit") {
if item.isHidden {
UIAction("Show", icon: "eye") { _ in
...
}
} else {
@achernoprudov
achernoprudov / UIAction+Build.swift
Last active July 27, 2021 11:03
UIAction convenience initializer
extension UIAction {
convenience init(_ title: String, icon systemIconName: String = "", handler: @escaping UIActionHandler) {
self.init(title: title, image: UIImage(systemName: systemIconName), handler: handler)
}
}
@achernoprudov
achernoprudov / uimenu-build-array.swift
Last active July 27, 2021 11:03
Building UIMenu in array DSL way
UIMenu(children: [
UIAction(title: "Open", image: UIImage(systemName: "xmark.octagon")) { _ in
...
},
UIMenu(title: "Edit", children: [
item.isHidden
? UIAction(title: "Show", image: UIImage(systemName: "eye")) { _ in
...
}
: UIAction(title: "Hide", image: UIImage(systemName: "eye.slash")) { _ in
@achernoprudov
achernoprudov / uimenu-build-old.swift
Created July 27, 2021 10:07
Building UIMenu in an old way
var actions: [UIAction] = []
actions.append(UIAction(title: "Open", image: UIImage(systemName: "xmark.octagon")) { _ in
...
})
// Sub menu
var subMenuActions: [UIAction] = []
if item.isHidden {
subMenuActions.append(UIAction(title: "Show", image: UIImage(systemName: "eye")) { _ in
...
})