SlideShare a Scribd company logo
1 of 127
Download to read offline
Protocol-Oriented
Programming in Swift
Oleksandr Stepanov
Oleksandr Stepanov
iOS developer @ AKQA Inc.
We are hiring!
Agenda
Agenda
• Protocols in Swift vs Objective-C
Agenda
• Protocols in Swift vs Objective-C
• Protocol-oriented programming
‣ What is that?
‣ Why to use it?
‣ How to use it?
Agenda
• Protocols in Swift vs Objective-C
• Protocol-oriented programming
‣ What is that?
‣ Why to use it?
‣ How to use it?
• Examples
Protocols
protocol someProtocol {
}
protocol someProtocol {
var someInt: Int { get }
var someString: String? { get set }
}
protocol someProtocol {
var someInt: Int { get }
var someString: String? { get set }
func doSomething(inputA: Int) -> String?
}
protocol someProtocol {
associatedtype TypeA;
var someInt: Int { get }
var someString: String? { get set }
func doSomething(inputA: Int) -> String?
func doSomethingWithTypeA(typeA: TypeA)
}
protocol someProtocol {
associatedtype TypeA;
var someInt: Int { get }
var someString: String? { get set }
func doSomething(inputA: Int) -> String?
func doSomethingWithTypeA(typeA: TypeA)
}
protocol successorProtocol: someProtocol {
}
…
extension somethingProtocol {
func doSomethingDifferent() {
print("Oh man, that is different")
}
func doSomethingWithTypeA(typeA: TypeA) {
print("typeA: (typeA)")
}
}
Protocols
Swift Objective-C
Protocol Inheritance ✅ ❌
Protocol extensions ✅ ❌
Default implementation ✅ ❌
Associated Types (aka Generics) ✅ ❌
Available in structures and
enums as well ✅ ❌
Swift Objective-C
Protocol Inheritance ✅ ❌
Protocol extensions ✅ ❌
Default implementation ✅ ❌
Associated Types (aka Generics) ✅ ❌
Available in structures and
enums as well ✅ ❌
Optional methods ❌ ✅
Protocols
import Foundation
@objc protocol optionalProtocol {
@objc optional func someOptionalMethod()
@objc optional var someOptionalInt: Int { get
set }
}
Swift Objective-C
Protocol Inheritance ✅ ❌
Protocol extensions ✅ ❌
Default implementation ✅ ❌
Associated Types (aka Generics) ✅ ❌
Available in structures and
enums as well ✅ ❌
Optional methods ✅
(@objc)
✅
Protocols
Protocol-oriented
programming
🤔
Protocol-oriented
programming
What is this?
🤔
WWDC 2015 - Session 408
Protocol-Oriented Programming in Swift
“Swift is a protocol-oriented programming language.”
Dave Abrahams
WWDC 2015 - Session 408
Protocol-Oriented Programming in Swift
“Swift is a protocol-oriented programming language.”
Dave Abrahams
https://developer.apple.com/videos/play/wwdc2015/408/
https://developer.apple.com/videos/play/wwdc2016/419/
Cars project 🚗
Implementation
Inheritance approach
class Car {
let wheels = 4
func make() {
print("🚗 is built")
}
}
class Car {
let wheels = 4
func make() {
print("🚗 is built")
}
}
class CarFactory {
var model: Car?
func makeACar() {
model?.make()
}
}
…
class Sedan: Car {}
let sedan = Sedan()
let carFactory = CarFactory()
carFactory.model = sedan
carFactory.makeACar() // prints “🚗 is built”
Let’s make 🏎
…
class Bolide: Car {
override func make() {
print("🏎 is built")
}
}
let bolide = Bolide()
let bolideFactory = CarFactory()
bolideFactory.model = bolide
bolideFactory.makeACar() // prints "🏎 is built"
Page 1 of 1
Let’s make 🏍
Implementation
Inheritance problems
class CarFactory {
var model: Car?
func makeACar() {
model?.make()
}
}
Tight coupling
Hard to maintain
Inheritance hierarchies
Hard to extend
class Car {
let wheels = 4
func make() {
print("🚗 is built")
}
}
class Sedan: Car {}
Implementation is a
white-box
… even using proper encapsulation
class Car {
let wheels = 4
func make() {
print("🚗 is built")
}
}
class Sedan: Car {}
Protocol-oriented
programming approach
✦ Separation of public interface
from the implementation
✦ Separation of public interface
from the implementation
✦ Software defined in components
that talk to each other using
interfaces
✦ Separation of public interface
from the implementation
✦ Software defined in components
that talk to each other using
interfaces
✦ May be used in conjunction with
classes, structs and enums.
protocol Vehicle {
func make()
}
protocol WheelsVehicle {
var wheels: Int { get }
}
…
protocol FourWheelsVehicle: WheelsVehicle {}
extension FourWheelsVehicle {
var wheels: Int {
get {
return 4
}
}
}
…
struct Car: Vehicle, FourWheelsVehicle {
func make() {
print("🚗 is built") }
}
}
struct Bolide: Vehicle, FourWheelsVehicle {
func make() {
print("🏎 is built")
}
}
…
struct Car: Vehicle, FourWheelsVehicle {
func make() {
print("🚗 is built") }
}
}
struct Bolide: Vehicle, FourWheelsVehicle {
func make() {
print("🏎 is built")
}
}
…
struct Car: Vehicle, FourWheelsVehicle {
func make() {
print("🚗 is built") }
}
}
struct Bolide: Vehicle, FourWheelsVehicle {
func make() {
print("🏎 is built")
}
}
…
protocol TwoWheelsVehicle: WheelsVehicle {}
extension TwoWheelsVehicle {
var wheels: Int { get { return 2 } }
}
struct MotorBike: Vehicle, TwoWheelsVehicle {
func make() {
print("🏍 is built") }
}
}
…
protocol VehicleFactory {
var model: Vehicle? { get set }
func makeACar()
}
extension VehicleFactory {
func makeACar() {
model?.make()
}
}
…
extension VehicleFactory {
func repairACar() {
// ...
}
}
…
class CarFactory: VehicleFactory {
var model: Vehicle?
}
let bolide = Bolide()
let carFactory = CarFactory()
carFactory.model = bolide
carFactory.makeACar() // prints "🏎 is built"
✦ Reusability
✦ Reusability
✦ Extensibility
✦ Reusability
✦ Extensibility
✦ Black-boxed
✦ Reusability
✦ Extensibility
✦ Black-boxed
MORE MAINTAINABLE
Patterns
where it can be useful
✦ Data types
• Abstraction
• Mock objects for test
✦ Data types
• Abstraction
• Mock objects for test
✦ Dependency injection
✦ Data types
• Abstraction
• Mock objects for test
✦ Dependency injection
✦ Detached architecture
• MVVM
✦ Data types
• Abstraction
• Mock objects for test
✦ Dependency injection
✦ Detached architecture
• MVVM
✦ Testing
• Unit
• A/B testing interfaces
Real life example
Real life example
UIKit
Table view cell
import UIKit
struct Event {
}
class EventTableViewCell: UITableViewCell {
}
import UIKit
struct Event {
let icon: UIImage?
let title: String
let date: Date
}
class EventTableViewCell: UITableViewCell {
@IBOutlet var iconView: UIImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var dateLabel: UILabel!
}
import UIKit
struct Event {
let icon: UIImage?
let title: String
let date: Date
}
class EventTableViewCell: UITableViewCell {
@IBOutlet var iconView: UIImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var dateLabel: UILabel!
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
Collection view cell
…
class EventTableViewCell: UITableViewCell {
…
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
class EventCollectionViewCell: UICollectionViewCell {
…
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
Header view
…
class EventTableViewCell: UITableViewCell {
…
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
class EventCollectionViewCell: UICollectionViewCell {
…
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
class EventHeaderView: UIView {
…
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
} }
Maintenance
Maintenance
😢
POP approach
protocol EventViewProtocol {
var iconView: UIImageView! { get set }
var titleLabel: UILabel! { get set }
var dateLabel: UILabel! { get set }
func set(event: Event)
}
protocol EventViewProtocol {
var iconView: UIImageView! { get set }
var titleLabel: UILabel! { get set }
var dateLabel: UILabel! { get set }
func set(event: Event)
}
extension EventViewProtocol {
func set(event: Event) {
iconView.image = event.icon
titleLabel.text = event.title
dateLabel.text = event.date.description
}
}
…
class EventTableViewCell: UITableViewCell {
@IBOutlet var iconView: UIImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var dateLabel: UILabel!
}
extension EventTableViewCell: EventViewProtocol
{}
Test it!
🔨
…
import XCTest
class TestView {
var iconView: UIImageView! = UIImageView()
var titleLabel: UILabel! = UILabel()
var dateLabel: UILabel! = UILabel()
}
extension TestView: EventViewProtocol {}
…
let eventDate = Date.init()
let event = Event.init(icon: UIImage.init(named: “testEventIcon”)
title: "event title",
date: eventDate)
let testView = TestView()
testView.set(event: event)
…
let eventDate = Date.init()
let event = Event.init(icon: UIImage.init(named: “testEventIcon”)
title: "event title",
date: eventDate)
let testView = TestView()
testView.set(event: event)
XCTAssertEqual ( testView.iconView.image,
UIImage.init(named:”testEventIcon”) )
XCTAssertEqual ( testView.titleLabel.text,
"event title” )
XCTAssertEqual ( testView.dateLabel.text,
eventDate.description )
✦ No code duplication -> better
maintainable
✦ No code duplication -> better
maintainable
✦ Better testable
✦ No code duplication -> better
maintainable
✦ Better testable
PROFIT!
One more sample
POP + Enums
One more sample
POP + Enums
NSNotification
-Literal string names
-Literal string names
-Potential for mismatched strings
-Literal string names
-Potential for mismatched strings
-There must be a better approach
-Slightly better …
-Slightly better …
-… but can we do even better?
}
}
}
How to enhance it with POP ?
}
❌
✦ No mismatched strings
✦ No mismatched strings
✦Simpler to read and maintain
✦ No mismatched strings
✦Simpler to read and maintain
✦ Notification handlers may be
classes, structs and enums
✦ No mismatched strings
✦Simpler to read and maintain
✦ Notification handlers may be
classes, structs and enums
✦ … the same for notification type
reusability
reusability
extensibility
understandability
reusability
extensibility
maintainability
understandability
reusability
extensibility
maintainability
understandability
testability
reusability
extensibility
POP
maintainability
understandability
testability
reusability
extensibility
it’s not a
it’s not a
treat it carefully
Thank you!
Q&A

More Related Content

What's hot

Lec 26.27-operator overloading
Lec 26.27-operator overloadingLec 26.27-operator overloading
Lec 26.27-operator overloadingPrincess Sam
 
Operator overloading
Operator overloadingOperator overloading
Operator overloadingabhay singh
 
Operator overloading and type conversions
Operator overloading and type conversionsOperator overloading and type conversions
Operator overloading and type conversionsAmogh Kalyanshetti
 
Operator overloading and type conversion in cpp
Operator overloading and type conversion in cppOperator overloading and type conversion in cpp
Operator overloading and type conversion in cpprajshreemuthiah
 
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator OverloadingHadziq Fabroyir
 
Bca 2nd sem u-4 operator overloading
Bca 2nd sem u-4 operator overloadingBca 2nd sem u-4 operator overloading
Bca 2nd sem u-4 operator overloadingRai University
 
Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to JavascriptAnjan Banda
 
Operator overloading
Operator overloadingOperator overloading
Operator overloadingKumar
 
operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++gourav kottawar
 
OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++Aabha Tiwari
 
Function overloading and overriding
Function overloading and overridingFunction overloading and overriding
Function overloading and overridingRajab Ali
 
C++ overloading
C++ overloadingC++ overloading
C++ overloadingsanya6900
 

What's hot (20)

Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
Lec 26.27-operator overloading
Lec 26.27-operator overloadingLec 26.27-operator overloading
Lec 26.27-operator overloading
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Operator overloading and type conversions
Operator overloading and type conversionsOperator overloading and type conversions
Operator overloading and type conversions
 
Operator overloading and type conversion in cpp
Operator overloading and type conversion in cppOperator overloading and type conversion in cpp
Operator overloading and type conversion in cpp
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
 
Bca 2nd sem u-4 operator overloading
Bca 2nd sem u-4 operator overloadingBca 2nd sem u-4 operator overloading
Bca 2nd sem u-4 operator overloading
 
operator overloading
operator overloadingoperator overloading
operator overloading
 
Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to Javascript
 
C++ Functions
C++ FunctionsC++ Functions
C++ Functions
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++
 
OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Unary operator overloading
Unary operator overloadingUnary operator overloading
Unary operator overloading
 
JavaScript Basics
JavaScript BasicsJavaScript Basics
JavaScript Basics
 
Function overloading and overriding
Function overloading and overridingFunction overloading and overriding
Function overloading and overriding
 
C++ overloading
C++ overloadingC++ overloading
C++ overloading
 

Similar to Protocol-Oriented Programming in Swift

WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedGil Fink
 
Diseño y Desarrollo de APIs
Diseño y Desarrollo de APIsDiseño y Desarrollo de APIs
Diseño y Desarrollo de APIsRaúl Neis
 
How to code to code less
How to code to code lessHow to code to code less
How to code to code lessAnton Novikau
 
Minimizing Decision Fatigue to Improve Team Productivity
Minimizing Decision Fatigue to Improve Team ProductivityMinimizing Decision Fatigue to Improve Team Productivity
Minimizing Decision Fatigue to Improve Team ProductivityDerek Lee Boire
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018Wim Selles
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackIgnacio Martín
 
Scala Future & Promises
Scala Future & PromisesScala Future & Promises
Scala Future & PromisesKnoldus Inc.
 
Maintaining a dependency graph with weaver
Maintaining a dependency graph with weaverMaintaining a dependency graph with weaver
Maintaining a dependency graph with weaverScribd
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extremeyinonavraham
 
Jan 2017 - a web of applications (angular 2)
Jan 2017 - a web of applications (angular 2)Jan 2017 - a web of applications (angular 2)
Jan 2017 - a web of applications (angular 2)Kasper Reijnders
 
Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018Loiane Groner
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterHaehnchen
 
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastHow Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastAtlassian
 

Similar to Protocol-Oriented Programming in Swift (20)

A First Date With Scala
A First Date With ScalaA First Date With Scala
A First Date With Scala
 
Anti Object-Oriented Design Patterns
Anti Object-Oriented Design PatternsAnti Object-Oriented Design Patterns
Anti Object-Oriented Design Patterns
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrived
 
Diseño y Desarrollo de APIs
Diseño y Desarrollo de APIsDiseño y Desarrollo de APIs
Diseño y Desarrollo de APIs
 
How to code to code less
How to code to code lessHow to code to code less
How to code to code less
 
Minimizing Decision Fatigue to Improve Team Productivity
Minimizing Decision Fatigue to Improve Team ProductivityMinimizing Decision Fatigue to Improve Team Productivity
Minimizing Decision Fatigue to Improve Team Productivity
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and Webpack
 
Scala Future & Promises
Scala Future & PromisesScala Future & Promises
Scala Future & Promises
 
Maintaining a dependency graph with weaver
Maintaining a dependency graph with weaverMaintaining a dependency graph with weaver
Maintaining a dependency graph with weaver
 
ParisJS #10 : RequireJS
ParisJS #10 : RequireJSParisJS #10 : RequireJS
ParisJS #10 : RequireJS
 
Python, WebRTC and You (v2)
Python, WebRTC and You (v2)Python, WebRTC and You (v2)
Python, WebRTC and You (v2)
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extreme
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
Jan 2017 - a web of applications (angular 2)
Jan 2017 - a web of applications (angular 2)Jan 2017 - a web of applications (angular 2)
Jan 2017 - a web of applications (angular 2)
 
Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
 
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastHow Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
 

Recently uploaded

React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....kzayra69
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 

Recently uploaded (20)

React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 

Protocol-Oriented Programming in Swift