Swift Closures

Main Idea

Closures are a bit like anonymous functions - functions we can create and assign directly to a variable or pass into other functions to customize how they work. Passing one function into another as a parameter.

One of the most common reasons for closures in Swift is to store functionality – to be able to say “here’s some work I want you to do at some point, but not necessarily now.” Some examples:

  1. Running some code after a delay.
  2. Running some code after an animation has finished.
  3. Running some code when a download has finished.
  4. Running some code when a user has selected an option from your menu.

Example Usecases

  1. When you create a list of data on the screen, SwiftUI will ask you to provide a function that accepts one item from the list and converts it something it can display on-screen.
  2. When you create a button, SwiftUI will ask you to provide one function to execute when the button is pressed, and another to generate the contents of the button – a picture, or some text, and so on.
  3. Even just putting stacking pieces of text vertically is done using a closure. ```swift // Copy function into variable func greetUser() { print(“Hi there!”) }

greetUser()

var greetCopy = greetUser greetCopy()

// Assign function into variable let sayHello = { print(“Hi there!”) }

sayHello()

// Add parameter to closure let sayHello = { (name: String) -> String in “Hi (name)!” }

sayHello(“Taylor”)

// Type Annotation for Closures var greetCopy: () -> Void = greetUser

// We lose the name of the variable func getUserData(for id: Int) -> String { if id == 1989 { return “Taylor Swift” } else { return “Anonymous” } }

let data: (Int) -> String = getUserData let user = data(1989) print(user)

let team = [“Gloria”, “Suzanne”, “Piper”, “Tiffany”, “Tasha”] let sortedTeam = team.sorted() print(sortedTeam)

func captainFirstSorted(name1: String, name2: String) -> Bool { if name1 == “Suzanne” { return true } else if name2 == “Suzanne” { return false }

return name1 < name2 }

let captainFirstTeam = team.sorted(by: captainFirstSorted) print(captainFirstTeam)

// pass entire closure into the function let captainFirstTeam = team.sorted(by: { (name1: String, name2: String) -> Bool in if name1 == “Suzanne” { return true } else if name2 == “Suzanne” { return false }

return name1 < name2 }

// Trailing Closures and shorthand syntax

// Remove the by: and closing paranthesis and typing string, string -> bool already known let captainFirstTeam = team.sorted { name1, name2 in if name1 == “Suzanne” { return true } else if name2 == “Suzanne” { return false }

return name1 < name2 }

// Shorthand $0 and $1 to remove name1 and name2 let captainFirstTeam = team.sorted { if $0 == “Suzanne” { return true } else if $1 == “Suzanne” { return false }

return $0 < $1 }

// If you use simple code like reverse sort you can use let reverseTeam = team.sorted { return $0 > $1 }

// Usecases

let tOnly = team.filter { $0.hasPrefix(“T”) } print(tOnly)

let uppercaseTeam = team.map { $0.uppercased() } print(uppercaseTeam)

// Write functions that accept functions as parameters

func makeArray(size: Int, using generator: () -> Int) -> [Int] { var numbers = Int

for _ in 0..<size {
    let newNumber = generator()
    numbers.append(newNumber)
}

return numbers }

let rolls = makeArray(size: 50) { Int.random(in: 1…20) }

print(rolls)

// Dedictated functions work too func generateNumber() -> Int { Int.random(in: 1…20) }

let newRolls = makeArray(size: 50, using: generateNumber) print(newRolls)

// Multiple trailing closures func doImportantWork(first: () -> Void, second: () -> Void, third: () -> Void) { print(“About to start first work”) first() print(“About to start second work”) second() print(“About to start third work”) third() print(“Done!”) }

doImportantWork { print(“This is the first work”) } second: { print(“This is the second work”) } third: { print(“This is the third work”) } ```

Notes mentioning this note


Here are all the notes in this garden, along with their links, visualized as a graph.

100DaysofSwiftUIAlgorithmsAffirmation TimerBPM ClapperBPM TrainingMetronome Vintage 3DHackingWithSwiftSwiftUI Accessibility Hiding and Grouping DataSwiftUI Accessibility Identifying ViewsSwiftUI Accessibility Read Value ControlsSwiftUI Accessibility Support as NeededSwiftUI AccessibilitySwiftUI Advanced ViewsSwiftUI CGAffineTransformSwiftUI Drawing animatableDataSwiftUI Drawing Special EffectsSwiftUI DrawingSwiftUI ImagePaintSwiftUI MetalSwiftUI PathsSwiftUI ShapesSwiftUI Image AlbumImage GeometryReaderSwiftUI Image InterpolationSwiftUI ImageSwiftUI Intergrate UIKitSwiftUI Basic ViewsSwiftUI ButtonsSwiftUI ColorSwiftUI GradientSwiftUI DatePickerSwiftUI Form ValidationSwiftUI FormSwiftUI SliderSwiftUI StepperSwiftUI TextEditorSwiftUI GridSwiftUI GroupsSwiftUI ListSwiftUI Navigation BarSwiftUI ScrollViewSwiftUI SpacersSwiftUI StacksSwiftUI Views And ModifiersSwiftUI Gestures AdvancedSwiftUI Gestures BasicSwiftUI Gestures CombinedSwiftUI GesturesSwiftUI Custom Row Swipe ActionsSwiftUI HapticsSwiftUI HitTestingSwiftUI InteractionsSwiftUI Searchable ViewsSwiftUI Absolute PositioningSwiftUI AlignmentSwiftUI AlignmentGuideSwiftUI Custom AlignmentSwiftUI GeometryReader BasicsSwiftUI GeometryReader UsageSwiftUI How Layout WorksSwiftUI Layout TechniquesSwiftUI Multiple Views Side by SideSwiftUI Switch View with EnumsSwiftUI Switch View with EnumsSwiftUI NavigationSwift NavigationLinkSwiftUI SheetsSwiftUI TabsSwiftUI BindingSwiftUI Environment WrapperSwiftUI FetchRequest WrapperSwiftUI FocusState WrapperSwiftUI MainActor WrapperSwiftUI ObservableObject WrapperSwiftUI ObservedObject WrapperSwiftUI Property WrappersSwift ObservableObject Manually Publishing ChangesSwiftUI State WrapperSwiftUI StateObject WrapperSwiftUI ViewBuilder WrapperSwiftUI ScenesSwiftUI AlertsSwiftUI Confirmation DialogSwiftUI Context MenuSwiftUI Popup WindowsSwiftUI SheetsCS193p Emoji ArtCS193p Matching GameCS193p Set GameStanford CS193pSwift Basic Data TypesSwift BooleanSwift FloatSwift IntSwift StringSwift ArraySwift ClassSwift Complex Data TypesSwift DictionarySwift EnumSwift SetSwift StructSwift Animating GesturesSwift Animating TransitionsSwift Animations TypesSwift animationsSwift Customize AnimationsSwift URLSessionSwift NetworkingSwift URLSessionSwift Comparable ProtocolsSwift ProtocolsSwift Codable @Published ComformanceSwift CodableSwift Documents DirectorySwift StorageSwift UserDefaultsSwiftSwift App BundleSwift Package DependenciesSwift TimerSwift ToolsSwift Basic TechniquesSwift ClosuresSwift ConditionsSwift ExtensionsSwift FunctionsSwift LoopsSwift OptionalsSwift Variable and ConstantsSwift TechniquesSwift Type AnnotationSwift Unique TypesSwift Result TypeSwift Framework CoreDataSwift Framework CoreImageSwift Framework LocalAuthenticationSwift Framework MLSwift Framework MapKitSwift Framework UNUserNotificationCenterSwift Framework Local NotificationsSwift Framework Remote NotificationsSwift Framework UserNotificationsSwift FrameworksSwiftUI FundamentalsSwiftUI WindowGroupA note about catsConsistency is keyHow to ThinkMove your body every dayYour first seedImage InterpolationCreate accessible spatial experiencesDevelop your first immersive appFundamental Design VisionOSGet started with building apps for spatial...Getting Started visionOSBuild great games for spatial computingCreate a great spatial playback experienceDeliver video content for spatial experiencesDiscover Metal for immersive appsStep Eight visionOSExplore rendering for spatial computingMeet Core Location for spatial computingMeet RealityKit TraceOptimize app power and performance for spatial...Step Five visionOSWhat’s new in Xcode 15Design considerations for vision and motionDesign for spatial inputDesign for spatial user interfacesDesign spatial SharePlay experiencesExplore immersive sound designStep Four visionOSDiscover Quick Look for spatial computingMeet Safari for spatial computingRediscover Safari developer featuresStep Nine visionOSWhat’s new in Safari extensionsBring your Unity VR app to a fully immersive spaceCreate immersive Unity appsExplore App Store Connect for spatial computingStep Seven visionOSExplore materials in Reality Composer ProExplore the USD ecosystemMeet Reality Composer ProStep Six visionOSWork with Reality Composer Pro content in XcodeBuild spatial SharePlay experiencesCreate 3D models for Quick Look spatial...Enhance your iPad and iPhone apps for the Shared...Run your iPad and iPhone apps in visionOSStep Ten visionOSBuilding Spatial Experiences with RealityKitEnhance your spatial computing app with RealityKitEvolve your ARKit app for spatial experiencesMeet ARKit for spatial computingStep Three visionOSElevate your windowed app for spatial computingGo beyond the window with SwiftUIMeet SwiftUI for spatial computingStep Two visionOSTake SwiftUI to the next dimensionTen Steps Overview of visionOS By AppleCreate multiple windows in VisionOSTap and Drag Spatial Gesture in VisionOSVisionOS Basic TutorialsvisionOS Documentation SeriesVisionOS Bear Balloon Reverse Gravity No CollisionVisionOS QuestionsWhy attend WWDCNew to WWDC