SlideShare ist ein Scribd-Unternehmen logo
1 von 99
Downloaden Sie, um offline zu lesen
Declarative UI on iOS Neo
About me
• 從 Objective-C 開始入坑的 iOS ⼯工程師
• 主修電機⼯工程、⾃自然語⾔言處理理
• 業餘前端 (react.js)
• AppCoda TW 作者
• Tokyo WebHack Meetup 組織者
• Blog: 鍵盤藍藍綠藻、S.T.H Brewery (拖稿中)
黃⼠士庭
Neo
About me
台北
東京
About me
About me
• 🏂

• 🚴

• 🎬

•☕
⼤大綱
• 背景
• 甚麼是 Declarative Programming
• 怎樣有效率地更更新 UI
• 怎樣讓語法更更 declarative
• 在實務上怎麼實作?
UI 的挑戰
過去的 UI
現代的 UI
UI = 資料 + 狀狀態
title
title
title
UI Data
{
"id": 1,
"title": "A title"
},
{
"id": 2,
"title": "A title"
},
{
"id": 3,
"title": "A title"
}
UI = 資料 + 狀狀態
title
loading
download
title
title
UI Data
{
"id": 1,
"title": "A title"
},
{
"id": 2,
"title": "A title"
},
{
"id": 3,
"title": "A title"
}
State
struct Item {
var isLoading: Bool
var isDownloaded:
Bool
}
UI = 資料 + 狀狀態
title
loading
download
title
title
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
}
}
UI = 資料 + 狀狀態
title
loading
download
title
title
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
}
}
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
cell.downloadBtn.state = stateArray[indexPath.row]
}
UI = 資料 + 狀狀態
title
+
download
title
title
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
}
}
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
cell.downloadBtn.state = stateArray[indexPath.row]
}
UI = 資料 + 狀狀態
title
+
download
title
title
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
}
}
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
cell.downloadBtn.state = stateArray[indexPath.row]
}
func addBookmark(indexPath: IndexPath) {
bookmarkArray[indexPath.row] = .bookmarked
}
UI = 資料 + 狀狀態
title
+
download
title
title
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
cell.bookmarkBtn.state = .bookmarked
}
}
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
cell.downloadBtn.state = stateArray[indexPath.row]
}
func addBookmark(indexPath: IndexPath) {
bookmarkArray[indexPath.row] = .bookmarked
}
UI = 資料 + 狀狀態
title
+
download
title
title
loading
😱
func downloadBtnPressed(at indexPath: IndexPath) {
if let cell = tableView.cellForRow(
at: indexPath) as? ListTableViewCell {
cell.downloadBtn.state = .loading
stateArray[indexPath.row] = .loading
cell.bookmarkBtn.state = .bookmarked
}
}
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
cell.downloadBtn.state = stateArray[indexPath.row]
}
func addBookmark(indexPath: IndexPath) {
bookmarkArray[indexPath.row] = .bookmarked
}
直接操作 UI 元件
cell.downloadBtn.state = .loading
cell.titleLabel.text = "title"
cell.backgroundColor = .gray
直接操作 UI 元件
title
loading
download
title
title
program
Imperative Programming
有沒有更更直觀的⽅方式?
SwiftUI
title
loading
download
title
title
Cell
var body: some View {
HStack {
Text(item.title)
Spacer()
Button(item.loadingText)
}
}
SwiftUI
title
loading
download
title
title
var body: some View {
HStack {
Text(item.title)
Spacer()
Button(item.loadingText)
}
}
Cell
SwiftUI
title
loading
download
title
title
}var body: some View {
List(items) { item in
Cell(item)
}
}
List
直接操作 UI 元件
cell.titleLabel.text = item.title
cell.downloadBtn.state = item.loadingState
讓 UI ⾃自⼰己對資料做出反應
HStack {
Text(item.title)
Spacer()
Button(item.loadingState)
}
Declarative UI
title
loading
download
title
title item
item
item
Declarative Programming
Declarative UI
• 只要告訴 UI 最終的狀狀態
• UI ⾃自⼰己會判別狀狀態的變化做更更新
But!
SwiftUI & iOS 13
SwiftUI & iOS 13
How? 😩
How? 🤔
來來分解 Declarative UI
來來分解 Declarative UI
title
loading
download
title
title title
title
title
UI Data
來來分解 Declarative UI
title
loading
download
title
title title
title
title
UI Data
直觀作法
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
...
cell.setup(items[indexPath.row])
...
}
Datasource
直觀作法
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
...
cell.setup(items[indexPath.row])
...
}
Datasource
var items: [CellItem] {
didSet {
tableView.reloadData()
}
}
資料
直觀作法
var items: [CellItem] {
didSet {
tableView.reloadData()
}
}
更更新資料
items[3].titleText = "New Title!"
直觀作法
title
loading
download
title2
title title
title2
title
UI State
reloadData( )
直觀作法
很⽅方便便,但是...🤨
⼤大量量重覆的運算
func tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCell {
...
cell.setup(items[indexPath.row])
...
}
只更更新狀狀態有變化的部分🕵
找出不同
title
loading
download
title2
title title
title2
title
UI Data
reload
找出不同
title
title
title
Old
title
title2
title
New
找出不同
title
title
Old
title
title
New
remove title2
找出不同
title
title
title
Old
title
title
New
insert title2title2
找出不同
tableView.reloadData()
tableView.deleteRows(at: [IndexPath(row: 1, section:
0)], with: .automatic)
tableView.insertRows(at: [IndexPath(row: 1, section:
0)], with: .automatic)
怎麼找出差異異?
怎麼找出差異異?
title
title
title
Old
title
title2
title
New
怎麼找出差異異?
title
title
title
title
title2
title
protocol Hashable { ... }
=
=
!=
A
A A
A
A B
怎麼找出差異異?
=
=
!=
A
A A
A
A B
[ ] [ ]
Edit distance 演算法
s w i f t
s h i f t y
• remove w at 1
• insert h at 1
• insert y at 5
怎麼找出差異異?
A
A A
A
A B
[ ] [ ]
怎麼找出差異異?
A
A A
A
A B
[ ] [ ]
• remove A at 1
• insert B at 1
找出不同
diffs = [.remove(1), .insert(B, at: 1)]
for diff in diffs {
switch diff {
case .insert(let index):
tableView.insertRows(xxx)
case .remove(let index):
tableView.deleteRows(xxx)
}
}
Edit distance 演算法
• Wagner–Fischer algorithm: O(MN) 
• Heckel algorithm: Linear time
• Myers algorithm: O(ND)
Edit distance 演算法
• Wagner–Fischer algorithm: O(MN) 
• Heckel algorithm: Linear time
• Myers algorithm: O(ND)
Diffing.swift
on Swift 5.1
Edit distance 演算法
• https://github.com/ra1028/DifferenceKit with Heckel
• https://github.com/onmyway133/DeepDiff with Heckel
• https://github.com/jflinter/Dwifft with Myers
• https://github.com/tonyarnold/Differ with Myers
💦
來來看看程式上的架構
架構
data
Edit distance
Calculator
Layout
Renderer
old
data
架構
data
Edit distance
Calculator
Layout
Renderer
old
data
資料
• 簡單的 struct 代表 UI 的狀狀態

• 必需是 Hashable

• 多數狀狀況可以被 compiler
auto-synthesis

• ⼩小⼼心NSObject!!
struct CellItem: Hashable {
var title: String
var backgroundColor: UIColor
}
資料
• 簡單的 struct 代表 UI 的狀狀態

• 必需是 Hashable

• 多數狀狀況可以被 compiler
auto-synthesis

• ⼩小⼼心NSObject!!
struct CellItem: Hashable {
var title: String
var backgroundColor: UIColor
}
資料
struct CellItem: Hashable {
var title: String
var backgroundColor: UIColor
}
var items: [CellItems]
架構
state
Edit distance
Calculator
Layout
Renderer
old
state
Edit distance calculator
var items: [CellItems] {
didSet {
let diffs = items.difference(from: oldValue)
tableView.apply(diffs)
}
}
Edit distance calculator
var items: [CellItems] {
didSet {
let diffs = items.difference(from: oldValue)
tableView.apply(diffs)
}
}
架構
state
Edit distance
Calculator
Layout
Renderer
old
state
Layout Renderer
extension UITableView {
func apply(diffs: CollectionDifference) {
self.beginUpdates()
for diff in diffs {
switch diff {
case .insert(let index):
self.insertRows(at: index)
case .remove(let index):
self.deleteRows(at: index)
}
}
self.endUpdates()
}
}
Layout Renderer
extension UITableView {
func apply(diffs: CollectionDifference) {
self.beginUpdates()
for diff in diffs {
switch diff {
case .insert(let index):
self.insertRows(at: index)
case .remove(let index):
self.deleteRows(at: index)
}
}
self.endUpdates()
}
}
找出不同
title
loading
download
title2
title title
title2
title
UI Data
reload
不夠 declarative 😒
架構
state
Edit distance
Calculator
Layout
Renderer
old
state
SwiftUI
title
loading
download
title
title
Cell
var body: some View {
HStack {
Text(item.title)
Spacer()
Button(item.loadingText)
}
}
當然不⾏行行
長得像就好 🙏
⽬目標
text3
text2
text1
Declarative style
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
text1 = "New value"
text3
text2
text1
架構
text3
text2
text1
hostView: UIStackView
新的狀狀態舊的狀狀態
difference
insertArrangedSubview
removeFromSuperview
Declarative style
text3
text2
text1
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
struct Label: Hashable {
var text: String
init(_ text: String) {
self.text = text
}
}
Sub-class: UIStackView
private var current: [Label] = []
func update(_ updated: [Label]) {
let diffs = updated.difference(from: current)
for diff in diffs {
switch diff {
case .insert(let index):
insertArrangedSubview(labelView, at: offset)
case .remove(let index):
arrangedSubviews[index].removeFromSuperview()
}
}
current = updated
}
Sub-class: UIStackView
private var current: [Label] = []
func update(_ updated: [Label]) {
let diffs = updated.difference(from: current)
for diff in diffs {
switch diff {
case .insert(let index):
insertArrangedSubview(labelView, at: offset)
case .remove(let index):
arrangedSubviews[index].removeFromSuperview()
}
}
current = updated
}
更更新資料
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
text1 = "New value"
更更新資料
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
text1 = "New value"
var text1: String {
didSet {
render()
}
}
更更新資料
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
text1 = "New value"
var text1: String {
didSet {
render()
}
}
重覆的部份很多
var text1: String {
didSet {
render()
}
}
var text2: String {
didSet {
render()
}
}
var text3: String {
didSet {
render()
}
}
簡單的Wrapper
class StateStore<T: Hashable>: Hashable {
private weak var renderer: Renderer?
var value: T {
didSet {
assert(renderer != nil)
renderer?.render()
}
}
init(renderer: Renderer, value: T) {
self.renderer = renderer
self.value = value
}
}
簡單的Wrapper
let text1 = StateStore(renderer: self, value:"Label 1”)
let text2 = StateStore(renderer: self, value:"Label 1”)
let text3 = StateStore(renderer: self, value:"Label 1”)
func render() {
hostView.update([
Label(text1),
Label(text2),
Label(text3),
])
}
text1.value = "update!"
更更複雜的狀狀況
View
state
更更複雜的狀狀況
render( )
最後
Demo
Demo
https://github.com/koromiko/SimpleDeclarativeSyntax
Demo
Declarative UI
Vue.js
參參考資料
• Swift 5.1 Collection Diffing - Federico Zanetello
• A better way to update UICollectionView data in Swift
with diff framework - Khoa Pham
• Introduction to declarative UI - Flutter
• DifferenceKit - Ryo Aoyama 
來來聊天吧
• Twitter: @KoromikoNeo
• GitHub: https://github.com/koromiko
• Website: https://huangshihting.works/
• LinkedIn: https://www.linkedin.com/in/huangshihting/
Thank you

Weitere ähnliche Inhalte

Was ist angesagt?

Connect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIConnect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIstable|kernel
 
From YUI3 to K2
From YUI3 to K2From YUI3 to K2
From YUI3 to K2kaven yan
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングscalaconfjp
 
Local Authentication par Pierre-Alban Toth
Local Authentication par Pierre-Alban TothLocal Authentication par Pierre-Alban Toth
Local Authentication par Pierre-Alban TothCocoaHeads France
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL UsersAll Things Open
 
Killing Shark-Riding Dinosaurs with ORM
Killing Shark-Riding Dinosaurs with ORMKilling Shark-Riding Dinosaurs with ORM
Killing Shark-Riding Dinosaurs with ORMOrtus Solutions, Corp
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Matthew Groves
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]Devon Bernard
 
Lean React - Patterns for High Performance [ploneconf2017]
Lean React - Patterns for High Performance [ploneconf2017]Lean React - Patterns for High Performance [ploneconf2017]
Lean React - Patterns for High Performance [ploneconf2017]Devon Bernard
 
Using Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineUsing Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineRiver of Talent
 
Connect.Tech- Swift Memory Management
Connect.Tech- Swift Memory ManagementConnect.Tech- Swift Memory Management
Connect.Tech- Swift Memory Managementstable|kernel
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldChristian Melchior
 
Alloy Tips & Tricks #TiLon
Alloy Tips & Tricks #TiLonAlloy Tips & Tricks #TiLon
Alloy Tips & Tricks #TiLonFokke Zandbergen
 
Intoduction to Play Framework
Intoduction to Play FrameworkIntoduction to Play Framework
Intoduction to Play FrameworkKnoldus Inc.
 
Webエンジニアから見たiOS5
Webエンジニアから見たiOS5Webエンジニアから見たiOS5
Webエンジニアから見たiOS5Satoshi Asano
 
YiiConf 2012 - Alexander Makarov - Yii2, what's new
YiiConf 2012 - Alexander Makarov - Yii2, what's newYiiConf 2012 - Alexander Makarov - Yii2, what's new
YiiConf 2012 - Alexander Makarov - Yii2, what's newAlexander Makarov
 
Building scalable applications with angular js
Building scalable applications with angular jsBuilding scalable applications with angular js
Building scalable applications with angular jsAndrew Alpert
 
How to write easy-to-test JavaScript
How to write easy-to-test JavaScriptHow to write easy-to-test JavaScript
How to write easy-to-test JavaScriptYnon Perek
 

Was ist angesagt? (20)

Connect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIConnect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCI
 
From YUI3 to K2
From YUI3 to K2From YUI3 to K2
From YUI3 to K2
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
 
Local Authentication par Pierre-Alban Toth
Local Authentication par Pierre-Alban TothLocal Authentication par Pierre-Alban Toth
Local Authentication par Pierre-Alban Toth
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL Users
 
Killing Shark-Riding Dinosaurs with ORM
Killing Shark-Riding Dinosaurs with ORMKilling Shark-Riding Dinosaurs with ORM
Killing Shark-Riding Dinosaurs with ORM
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]
 
Lean React - Patterns for High Performance [ploneconf2017]
Lean React - Patterns for High Performance [ploneconf2017]Lean React - Patterns for High Performance [ploneconf2017]
Lean React - Patterns for High Performance [ploneconf2017]
 
Using Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineUsing Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App Engine
 
Connect.Tech- Swift Memory Management
Connect.Tech- Swift Memory ManagementConnect.Tech- Swift Memory Management
Connect.Tech- Swift Memory Management
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
 
Alloy Tips & Tricks #TiLon
Alloy Tips & Tricks #TiLonAlloy Tips & Tricks #TiLon
Alloy Tips & Tricks #TiLon
 
Intoduction to Play Framework
Intoduction to Play FrameworkIntoduction to Play Framework
Intoduction to Play Framework
 
Webエンジニアから見たiOS5
Webエンジニアから見たiOS5Webエンジニアから見たiOS5
Webエンジニアから見たiOS5
 
Workshop 15: Ionic framework
Workshop 15: Ionic frameworkWorkshop 15: Ionic framework
Workshop 15: Ionic framework
 
YiiConf 2012 - Alexander Makarov - Yii2, what's new
YiiConf 2012 - Alexander Makarov - Yii2, what's newYiiConf 2012 - Alexander Makarov - Yii2, what's new
YiiConf 2012 - Alexander Makarov - Yii2, what's new
 
Building scalable applications with angular js
Building scalable applications with angular jsBuilding scalable applications with angular js
Building scalable applications with angular js
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
How to write easy-to-test JavaScript
How to write easy-to-test JavaScriptHow to write easy-to-test JavaScript
How to write easy-to-test JavaScript
 

Ähnlich wie Declarative UI on iOS without SwiftUI (中文)

Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOSjimmyatmedium
 
Programming iOS in C#
Programming iOS in C#Programming iOS in C#
Programming iOS in C#Frank Krueger
 
iPhone Development Intro
iPhone Development IntroiPhone Development Intro
iPhone Development IntroLuis Azevedo
 
Cross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumCross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumYiguang Hu
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testingdrewz lin
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-FunctionsIntegration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-FunctionsBizTalk360
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»DataArt
 
System insight without Interference
System insight without InterferenceSystem insight without Interference
System insight without InterferenceTony Tam
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframeworkErhwen Kuo
 
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve MobileMobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve MobileKonstantin Loginov
 
Building Papers
Building PapersBuilding Papers
Building PapersMahmoud
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade ServerlessKatyShimizu
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responsesdarrelmiller71
 
[React Native Tutorial] Lecture 6: Component, Props, and Network
[React Native Tutorial] Lecture 6: Component, Props, and Network[React Native Tutorial] Lecture 6: Component, Props, and Network
[React Native Tutorial] Lecture 6: Component, Props, and NetworkKobkrit Viriyayudhakorn
 
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry Meetup
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry MeetupIntro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry Meetup
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry MeetupJosh Ghiloni
 

Ähnlich wie Declarative UI on iOS without SwiftUI (中文) (20)

Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOS
 
Programming iOS in C#
Programming iOS in C#Programming iOS in C#
Programming iOS in C#
 
WOdka
WOdkaWOdka
WOdka
 
iPhone Development Intro
iPhone Development IntroiPhone Development Intro
iPhone Development Intro
 
Cross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumCross platform Mobile development on Titanium
Cross platform Mobile development on Titanium
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Intro to appcelerator
Intro to appceleratorIntro to appcelerator
Intro to appcelerator
 
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-FunctionsIntegration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
 
System insight without Interference
System insight without InterferenceSystem insight without Interference
System insight without Interference
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframework
 
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve MobileMobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
 
Building Papers
Building PapersBuilding Papers
Building Papers
 
Titanium Alloy Tutorial
Titanium Alloy TutorialTitanium Alloy Tutorial
Titanium Alloy Tutorial
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
[React Native Tutorial] Lecture 6: Component, Props, and Network
[React Native Tutorial] Lecture 6: Component, Props, and Network[React Native Tutorial] Lecture 6: Component, Props, and Network
[React Native Tutorial] Lecture 6: Component, Props, and Network
 
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry Meetup
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry MeetupIntro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry Meetup
Intro to Spring Boot and Spring Cloud OSS - Twin Cities Cloud Foundry Meetup
 

Kürzlich hochgeladen

Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations120cr0395
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSKurinjimalarL3
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escortsranjana rawat
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...Call Girls in Nagpur High Profile
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVRajaP95
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130Suhani Kapoor
 
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).pptssuser5c9d4b1
 
UNIT-V FMM.HYDRAULIC TURBINE - Construction and working
UNIT-V FMM.HYDRAULIC TURBINE - Construction and workingUNIT-V FMM.HYDRAULIC TURBINE - Construction and working
UNIT-V FMM.HYDRAULIC TURBINE - Construction and workingrknatarajan
 
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Serviceranjana rawat
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)Suman Mia
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxpranjaldaimarysona
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝soniya singh
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Dr.Costas Sachpazis
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxupamatechverse
 

Kürzlich hochgeladen (20)

Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
 
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt
247267395-1-Symmetric-and-distributed-shared-memory-architectures-ppt (1).ppt
 
UNIT-V FMM.HYDRAULIC TURBINE - Construction and working
UNIT-V FMM.HYDRAULIC TURBINE - Construction and workingUNIT-V FMM.HYDRAULIC TURBINE - Construction and working
UNIT-V FMM.HYDRAULIC TURBINE - Construction and working
 
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptx
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 

Declarative UI on iOS without SwiftUI (中文)