├── .gitignore
├── .swift-version
├── .travis.yml
├── Example
├── Configuration+TrySwift.swift
├── Podfile
├── Podfile.lock
├── Tests
│ ├── Info.plist
│ ├── NYC-2017
│ │ ├── TKO2017ConferenceDays.swift
│ │ ├── TKO2017Conferences.swift
│ │ ├── TKO2017Events.swift
│ │ ├── TKO2017Locations.swift
│ │ ├── TKO2017Organizers.swift
│ │ ├── TKO2017Presentations.swift
│ │ ├── TKO2017SessionBlocks.swift
│ │ ├── TKO2017Sessions.swift
│ │ ├── TKO2017Speakers.swift
│ │ ├── TKO2017Sponsors.swift
│ │ └── TKO2017Venues.swift
│ └── SessionTests
│ │ ├── AnnouncementSessionViewModelTests.swift
│ │ ├── BreakfastSessionViewModelTests.swift
│ │ ├── CoffeeBreakSessionViewModelTests.swift
│ │ ├── LightningTalkSessionViewModelTests.swift
│ │ ├── LunchSessionViewModelTests.swift
│ │ ├── MeetupSessionViewModelTests.swift
│ │ ├── OfficeHoursSessionViewModelTests.swift
│ │ ├── PartySessionViewModelTests.swift
│ │ ├── SessionViewModelTests.swift
│ │ ├── SponsoredDemoSessionViewModelTests.swift
│ │ ├── TalkSessionViewModelTests.swift
│ │ └── WorkshopSessionViewModelTests.swift
├── TrySwiftData.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── TrySwiftData_Tests.xcscheme
├── TrySwiftData.xcworkspace
│ └── contents.xcworkspacedata
├── trySwiftData.xcodeproj
│ └── project.xcworkspace
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── trySwiftData.xcworkspace
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── LICENSE
├── README.md
├── TrySwiftData.podspec
└── TrySwiftData
├── Assets
├── Conferences
│ ├── BLR-2017
│ │ └── Logo_BLR.png
│ ├── Icons
│ │ ├── announce1.png
│ │ ├── announce2.png
│ │ ├── announce_blr.png
│ │ ├── announce_nyc_1.png
│ │ ├── announce_nyc_2.png
│ │ ├── bento1.png
│ │ ├── bento2.png
│ │ ├── bowling.png
│ │ ├── breaktime1.png
│ │ ├── breaktime2.png
│ │ ├── donuts1.png
│ │ ├── donuts2.png
│ │ ├── lunch.png
│ │ ├── lunch2.png
│ │ ├── lunch3.png
│ │ ├── party1.png
│ │ ├── party2.png
│ │ ├── rikoOrange.png
│ │ └── rikoPurple.png
│ ├── NYC2019
│ │ ├── Logo_NYC.png
│ │ ├── WatchLogo_NYC.png
│ │ ├── organizers
│ │ │ ├── alvin.jpg
│ │ │ ├── daisy.jpg
│ │ │ ├── erica.png
│ │ │ ├── jpmarthajp.jpg
│ │ │ ├── natasha.jpg
│ │ │ ├── saraAhmed.jpg
│ │ │ ├── vaish.jpg
│ │ │ └── yucovin.jpg
│ │ ├── speakers
│ │ │ ├── agora_talk.png
│ │ │ ├── anne.jpg
│ │ │ ├── bosear_talk.png
│ │ │ ├── brennan.jpg
│ │ │ ├── cate.jpg
│ │ │ ├── dabby.jpg
│ │ │ ├── dave.jpg
│ │ │ ├── dave_delong.jpg
│ │ │ ├── dr.jpg
│ │ │ ├── eli.jpg
│ │ │ ├── hosts
│ │ │ │ ├── amy.jpg
│ │ │ │ ├── chris.jpg
│ │ │ │ └── hector.jpg
│ │ │ ├── instructors
│ │ │ │ ├── bosearsquare.png
│ │ │ │ ├── carson.jpg
│ │ │ │ ├── carson_mark.jpg
│ │ │ │ ├── chris-workshop.jpg
│ │ │ │ ├── ian.jpg
│ │ │ │ ├── jonbott.jpg
│ │ │ │ ├── mas.png
│ │ │ │ ├── pauls.jpg
│ │ │ │ ├── sanjeev.jpg
│ │ │ │ └── sanjian.png
│ │ │ ├── ish.jpg
│ │ │ ├── jean.jpg
│ │ │ ├── jordan.jpg
│ │ │ ├── kaitlin.jpg
│ │ │ ├── kelly.jpg
│ │ │ ├── laura.jpg
│ │ │ ├── lea.jpg
│ │ │ ├── marc.jpg
│ │ │ ├── nick.jpg
│ │ │ ├── paige.jpg
│ │ │ ├── paul.jpg
│ │ │ ├── shai.jpg
│ │ │ ├── soojinro.jpg
│ │ │ ├── tom_doron.jpg
│ │ │ ├── twilio_talk.png
│ │ │ └── yuki.jpg
│ │ ├── sponsors
│ │ │ ├── diamond
│ │ │ │ └── wework.jpg
│ │ │ ├── diversity
│ │ │ │ ├── automattic.jpg
│ │ │ │ ├── lickability.png
│ │ │ │ └── twitter.png
│ │ │ ├── gold
│ │ │ │ ├── bosear.jpg
│ │ │ │ ├── bugsnag.png
│ │ │ │ ├── jetbrains.png
│ │ │ │ ├── mongodb.png
│ │ │ │ ├── twilio.png
│ │ │ │ └── wayfair.jpg
│ │ │ ├── individual
│ │ │ │ ├── cody.jpg
│ │ │ │ ├── gett.jpg
│ │ │ │ ├── orange.png
│ │ │ │ ├── rift.jpg
│ │ │ │ └── tim.jpg
│ │ │ ├── platinum
│ │ │ │ ├── IBM.png
│ │ │ │ ├── agora.jpg
│ │ │ │ └── bitrise.png
│ │ │ └── silver
│ │ │ │ └── merrill.png
│ │ └── venues
│ │ │ ├── frames.jpg
│ │ │ └── nws.jpg
│ ├── SJO-2018
│ │ └── Logo_SJO.png
│ ├── TKO-2019
│ │ ├── Logo_TKO.png
│ │ └── WatchLogo_TKO.png
│ ├── tryswift.realm.lock
│ └── tryswift.realm.management
│ │ ├── access_control.balance.mx
│ │ ├── access_control.control.mx
│ │ └── access_control.write.mx
├── en.lproj
│ └── TrySwiftDataLocalizable.strings
└── ja.lproj
│ └── TrySwiftDataLocalizable.strings
├── Data
└── NYC-2019
│ ├── NYC2019ConferenceDays.swift
│ ├── NYC2019Conferences.swift
│ ├── NYC2019Events.swift
│ ├── NYC2019Locations.swift
│ ├── NYC2019Organizers.swift
│ ├── NYC2019Presentations.swift
│ ├── NYC2019SessionBlocks.swift
│ ├── NYC2019Sessions.swift
│ ├── NYC2019Speakers.swift
│ ├── NYC2019Sponsors.swift
│ └── NYC2019Venues.swift
├── Extensions
├── Array+TrySwiftData.swift
├── Bundle+TrySwiftData.swift
├── Date+Timepiece.swift
├── Object+LocalizedProperty.swift
└── String+TrySwiftData.swift
├── Models
├── Conference.swift
├── ConferenceDay.swift
├── Event.swift
├── Location.swift
├── Organizer.swift
├── Presentation.swift
├── Session.swift
├── SessionBlock.swift
├── Speaker.swift
├── Sponsor.swift
└── Venue.swift
└── ViewModels
└── SessionViewModel
├── SessionTypeViewModels
├── SessionDataDefaults.swift
├── SessionDisplayableProtocol.swift
└── SessionDisplayableTypes
│ ├── AnnouncementSessionViewModel.swift
│ ├── BreakfastSessionViewModel.swift
│ ├── CoffeeBreakSessionViewModel.swift
│ ├── LightningTalkSessionViewModel.swift
│ ├── LunchSessionViewModel.swift
│ ├── MeetupSessionViewModel.swift
│ ├── OfficeHoursSessionViewModel.swift
│ ├── PanelSessionViewModel.swift
│ ├── PartySessionViewModel.swift
│ ├── RegistrationSessionViewModel.swift
│ ├── SponsoredDemoSessionViewModel.swift
│ ├── TalkSessionViewModel.swift
│ └── WorkshopSessionViewModel.swift
└── SessionViewModel.swift
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 |
4 | # Xcode
5 | build/
6 | *.pbxuser
7 | !default.pbxuser
8 | *.mode1v3
9 | !default.mode1v3
10 | *.mode2v3
11 | !default.mode2v3
12 | *.perspectivev3
13 | !default.perspectivev3
14 | xcuserdata/
15 | *.xccheckout
16 | profile
17 | *.moved-aside
18 | DerivedData
19 | *.hmap
20 | *.ipa
21 |
22 | # Bundler
23 | .bundle
24 |
25 | Carthage
26 | # We recommend against adding the Pods directory to your .gitignore. However
27 | # you should judge for yourself, the pros and cons are mentioned at:
28 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
29 | #
30 | # Note: if you ignore the Pods directory, make sure to uncomment
31 | # `pod install` in .travis.yml
32 | #
33 | Pods/
34 |
--------------------------------------------------------------------------------
/.swift-version:
--------------------------------------------------------------------------------
1 | 3.0
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # references:
2 | # * http://www.objc.io/issue-6/travis-ci.html
3 | # * https://github.com/supermarin/xcpretty#usage
4 |
5 | osx_image: xcode7.3
6 | language: objective-c
7 | # cache: cocoapods
8 | # podfile: Example/Podfile
9 | # before_install:
10 | # - gem install cocoapods # Since Travis is not always on latest version
11 | # - pod install --project-directory=Example
12 | script:
13 | - set -o pipefail && xcodebuild test -workspace Example/trySwiftData.xcworkspace -scheme trySwiftData-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty
14 | - pod lib lint
15 |
--------------------------------------------------------------------------------
/Example/Configuration+TrySwift.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Configuration+TrySwift.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 2/14/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 |
12 | extension Realm.Configuration {
13 | public static var trySwiftLocalConfiguration: Realm.Configuration {
14 | let bundle =
15 |
16 | var configuration = Realm.Configuration.defaultConfiguration
17 | configuration.readOnly = true
18 | return configuration
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Example/Podfile:
--------------------------------------------------------------------------------
1 | use_frameworks!
2 | platform :ios, '11.0'
3 |
4 | target ‘TrySwiftData_Tests' do
5 | pod ‘TrySwiftData', :path => '../'
6 |
7 | post_install do |installer|
8 | installer.pods_project.targets.each do |target|
9 | target.build_configurations.each do |config|
10 | config.build_settings['SWIFT_VERSION'] = '4.0'
11 | end
12 | end
13 | end
14 |
15 | end
16 |
--------------------------------------------------------------------------------
/Example/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - TrySwiftData (0.1.0):
3 | - TrySwiftData/TrySwiftAssets (= 0.1.0)
4 | - TrySwiftData/TrySwiftAssets (0.1.0)
5 |
6 | DEPENDENCIES:
7 | - TrySwiftData (from `../`)
8 |
9 | EXTERNAL SOURCES:
10 | TrySwiftData:
11 | :path: "../"
12 |
13 | SPEC CHECKSUMS:
14 | TrySwiftData: 6ae96c51963fa7fe5698b20dfd9e279ce5d978b7
15 |
16 | PODFILE CHECKSUM: f90fa0a429c447a2ce4ad39681f2a1ec8628b580
17 |
18 | COCOAPODS: 1.7.5
19 |
--------------------------------------------------------------------------------
/Example/Tests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017ConferenceDays.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016ConferenceDays.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | import Foundation
12 | import RealmSwift
13 | import TrySwiftData
14 |
15 | public let tko2017ConferenceDays: [ConferenceDay] = [
16 | {
17 | let day1 = ConferenceDay()
18 | day1.date = Date.date(year: 2017, month: 3, day: 2, hour: 16, minute: 0, second: 0)
19 | for index in 0...21 {
20 | day1.sessionBlocks.append(tko2017SessionBlocks[index])
21 | }
22 | return day1
23 | }(),
24 | {
25 | let day2 = ConferenceDay()
26 | day2.date = Date.date(year: 2017, month: 3, day: 3, hour: 16, minute: 0, second: 0)
27 | for index in 22...45 {
28 | day2.sessionBlocks.append(tko2017SessionBlocks[index])
29 | }
30 | return day2
31 | }(),
32 | {
33 | let day3 = ConferenceDay()
34 | day3.date = Date.date(year: 2017, month: 3, day: 4, hour: 16, minute: 0, second: 0)
35 | for index in 46...55 {
36 | day3.sessionBlocks.append(tko2017SessionBlocks[index])
37 | }
38 | return day3
39 | }()
40 | ]
41 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Conferences.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Conferences.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Conferences: [Conference] = [
14 | {
15 | let trySwift = Conference()
16 | trySwift.name = "try! Conference"
17 | trySwift.twitter = "tryswiftconf"
18 | trySwift.logoAssetName = "Logo.png"
19 | trySwift.conferenceDescription = "try! Conference is an immersive community gathering about Swift Language Best Practices, Application Development in Swift, Server-Side Swift, Open Source Swift, and the Swift Community, taking place in Tokyo on March 2nd through 4th, 2017."
20 | trySwift.conferenceDescriptionJP = "「try! Swift」はプログラミング言語Swiftに関する ミュニティ主催のカンファレンスです。ベストプラクティス、アプリケーション開発、サーバーサイドSwift、オープンソースSwiftなど、Swiftに関する技術情報とコミュニケーションを目的に2017年3月2日〜4日の3日間にわたって開催されます。 3月2日、3日はSwiftコミュニティのエキスパートに る講演、4日はハッカソンを行います。すべての講演は同時通訳されます。(日本語→英語、英語→日本語)"
21 | trySwift.organizers.append(tko2017Organizers["natashatherobot"]!)
22 | trySwift.organizers.append(tko2017Organizers["katsumi"]!)
23 | trySwift.organizers.append(tko2017Organizers["kazunobu"]!)
24 | trySwift.organizers.append(tko2017Organizers["satoshi"]!)
25 | trySwift.organizers.append(tko2017Organizers["himi"]!)
26 | trySwift.organizers.append(tko2017Organizers["shingo"]!)
27 | trySwift.organizers.append(tko2017Organizers["matt"]!)
28 | trySwift.organizers.append(tko2017Organizers["nino"]!)
29 | trySwift.venues.append(tko2017Venues["bellesalle-shinjuku"]!)
30 | trySwift.venues.append(tko2017Venues["bellesalle-kanda"]!)
31 | trySwift.venues.append(tko2017Venues["christon"]!)
32 | return trySwift
33 | }()
34 | ]
35 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Events.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Events.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Events: [String : Event] = [:]
14 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Locations.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Locations.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Locations: [String : Location] = [
14 | "qaroom" : {
15 | let location = Location()
16 | location.name = "Q&A Room"
17 | location.nameJP = "Q&Aルーム"
18 | return location
19 | }(),
20 | "mainroom" : {
21 | let location = Location()
22 | location.name = "Hall"
23 | location.nameJP = "ホール"
24 | return location
25 | }(),
26 | "hackathonroom" : {
27 | let location = Location()
28 | location.name = "2F Hall"
29 | location.nameJP = "2F ホール"
30 | return location
31 | }(),
32 | "workshoproom" : {
33 | let location = Location()
34 | location.name = "3F Seminar Room 4, 5, 6"
35 | location.nameJP = "3F セミナールーム 4, 5, 6"
36 | return location
37 | }()
38 | ]
39 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Organizers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Speakers.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Organizers: [String : Organizer] = [
14 | "natashatherobot" : {
15 | let natashatherobot = Organizer()
16 | natashatherobot.id = 1
17 | natashatherobot.hidden = true
18 | natashatherobot.name = "Natasha Murashev"
19 | natashatherobot.twitter = "NatashaTheRobot"
20 | natashatherobot.imageAssetName = "natasha_murashev.jpg"
21 | natashatherobot.bio = "Natasha is an iOS developer by day and a robot by night. She blogs about Swift, WatchOS, and iOS development on her blog, natashatherobot.com, curates a fast-growing weekly Swift newsletter, This Week in Swift, and organizes the try! Swift Conference around the world (including this one!). She's currently living the digital nomad life as her alter identity: @NatashaTheNomad."
22 | natashatherobot.bioJP = "昼間はiOSデベロッパ、夜はロボットです。natashatherobot.comでSwiftやwatchOS、iOS開発に関するブログを書いています。急成長中の週刊Swiftニュースレター、This Week in Swiftや(今回を含めて)世界中で try! Swift カンファレンスを運営しています。現在は@NatashaTheNomadとしてデジタルノマド生活を送っています。"
23 | return natashatherobot
24 | }(),
25 | "katsumi" : {
26 | let organizer = Organizer()
27 | organizer.id = 2
28 | organizer.hidden = true
29 | organizer.name = "Katsumi Kishikawa"
30 | organizer.twitter = "k_katsumi"
31 | organizer.imageAssetName = "katsumi_kishikawa.jpg"
32 | organizer.bio = "Katsumi Kishikawa is an iOS/macX developer working at Realm. He has serial open source library developer, and has published some popular libraries on GitHub. He has large contributed to iOS developer community in Japan with his experience and knowledge."
33 | organizer.bioJP = "iOS/macOSアプリケーションの開発者で、モバイルデータベースを開発するRealmに勤務しながら、さまざまな企業にテクニカルアドバイザーとして関わっています。また、個人の活動として、多数のオープンソースライブラリをGitHubにて公開しています。"
34 | return organizer
35 | }(),
36 | "kazunobu" : {
37 | let organizer = Organizer()
38 | organizer.id = 3
39 | organizer.hidden = true
40 | organizer.name = "Kazunobu Tasaka"
41 | organizer.twitter = "tasanobu"
42 | organizer.imageAssetName = "kazunobu_tasaka.jpg"
43 | organizer.bio = "Kazunobu Tasaka is an iOS developer at CyberAgent. He has been developing AbemaTV for iOS. Before that, he had worked on Ameba Blog and Ameba Platform SDK. On weekend, he enjoys Japanese sake🍶 and watching soccer games."
44 | organizer.bioJP = "サイバーエージェントのiOSデベロッパーです。AbemaTVのiOSアプリを開発しています。以前はアメーバアプリやAmebaプラットフォームのSDKを担当していました。週末は日本酒を飲みながらサッカー観戦しています。"
45 | return organizer
46 | }(),
47 | "satoshi" : {
48 | let organizer = Organizer()
49 | organizer.id = 4
50 | organizer.hidden = true
51 | organizer.name = "Satoshi Hachiya"
52 | organizer.twitter = "jpmartha_jp"
53 | organizer.imageAssetName = "satoshi_hachiya.jpg"
54 | organizer.bio = "Satoshi is a Japanese iOS freelancer. He is currently making an iOS app called Player! and sometimes translates Realm news into Japanese. He also organizes some iOS meetups around Japan. And, he likes pancakes so much that he tries cooking pancakes. It doesn't look appetizing, but it tastes pretty good ¯\\_(ツ)_/¯"
55 | organizer.bioJP = "日本人のiOSフリーランスです。 現在はPlayer!というiOSアプリを作っています。Realmのニュースを日本語に翻訳することもあります。また、日本中を回っていくつかのiOSミートアップを開催しています。そしてパンケーキがとても好きなので、パンケーキ作りにチャレンジしています。見た目はよくないですがかなりおいしいですよ。¯\\_(ツ)_/¯"
56 | return organizer
57 | }(),
58 | "himi" : {
59 | let organizer = Organizer()
60 | organizer.id = 5
61 | organizer.hidden = true
62 | organizer.name = "Himi Sato"
63 | organizer.twitter = "himisanta"
64 | organizer.imageAssetName = "himi_sato.jpg"
65 | organizer.bio = "Himi Sato is a Co-founder of Women Who Code Tokyo. Women Who Code (WWCode) is global non-profit dedicated to inspiring women to excel in technology careers. We work to support this generation in being and becoming leaders and role models in the tech industry. She likes coding Swift and joined at try!Swift as a speaker last time. She loves travelling, music, watching sports and seeing with new people!"
66 | organizer.bioJP = "Women Who Code TokyoのCo-founderをしています。WWCodeは、女性がテクノロジーキャリアで活躍できるようインスパイアするグローバルNPO団体で、現世代の女性たちがテクノロジー業界においてリーダーやロールモデルになるようサポートする働きがけをしています。HimiはSwiftコーディングが好きで、前回はスピーカーとして参加しました。旅行、音楽、スポーツ観戦そして新しい人たちに会うのが大好きです!"
67 | return organizer
68 | }(),
69 | "shingo" : {
70 | let organizer = Organizer()
71 | organizer.id = 6
72 | organizer.hidden = true
73 | organizer.name = "Shingo Sato"
74 | organizer.twitter = "akio0911"
75 | organizer.imageAssetName = "shingo_sato.jpg"
76 | organizer.bio = "Shingo Sato ( a.k.a akio0911 ) is a Japanese iOS freelancer. He is currently making an iOS app called FiNC and SO by MIDORI.so. He also holds a lecture about iOS app developing called App Creator Dojo across Japan.And, he has colorful hair. It's not wig. It's his natural hair."
77 | organizer.bioJP = "日本人のiOSフリーランスです。現在はFiNC、そしてSO by MIDORI.soというiOSアプリを作っています。アプリ道場というiOSアプリ開発の講座を日本中で開催しています。カラフルな髪をしていますが、これはウィッグではなく地毛です。"
78 | return organizer
79 | }(),
80 | "matt" : {
81 | let organizer = Organizer()
82 | organizer.id = 7
83 | organizer.hidden = true
84 | organizer.name = "Matt Gillingham"
85 | organizer.twitter = "gillygize"
86 | organizer.imageAssetName = "matt_gillingham.jpg"
87 | organizer.bio = "Matt Gillingham is currently co-founder and CTO of Eventacular. He has been developing on the iOS platform for 8 years and has organized the monthly Tokyo iOS Meetup for 6 years. He knows kung fu."
88 | organizer.bioJP = "株式会社Eventacularの共同創業者とCTOです。8年間iOSプラットフォームを開発して、6年間Tokyo iOS Meetupをオーガナイズしています。カンフーもやります。"
89 | return organizer
90 | }(),
91 | "nino" : {
92 | let organizer = Organizer()
93 | organizer.id = 8
94 | organizer.hidden = true
95 | organizer.name = "Nino Sakuma"
96 | organizer.twitter = "yucovin"
97 | organizer.imageAssetName = "nino_sakuma.jpg"
98 | organizer.bio = "Nino Sakuma ( a. k. a. yucovin ) is a designer and a painter in Japan. She loves Apple products so much that she became an iOS developer. Her hobby is playing the violin in an amateur orchestra. The new try! Swift bird is designed by her."
99 | organizer.bioJP = "フリーランスのイラストレーター兼デザイナーです。アップル製品好きがこうじて、iOSデベロッパーにもなりました。趣味はバイオリンを弾くこと、アマチュアオーケストラで活動しています。今回はtry! Swiftの新しいロゴデザインも提供しています。"
100 | return organizer
101 | }(),
102 | ]
103 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Sponsors.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Sponsors.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Sponsors: [String : Sponsor] = [
14 | //Platinum
15 | "ibm" : {
16 | let sponsor = Sponsor()
17 | sponsor.name = "IBM"
18 | sponsor.url = "http://www.ibm.com/"
19 | sponsor.displayURL = "ibm.com"
20 | sponsor.twitter = "IBM"
21 | sponsor.logoAssetName = "ibm.png"
22 | sponsor.level = .platinum
23 | return sponsor
24 | }(),
25 | "cyberagent" : {
26 | let sponsor = Sponsor()
27 | sponsor.name = "CyberAgent"
28 | sponsor.url = "http://www.cyberagent.co.jp/"
29 | sponsor.displayURL = "cyberagent.co.jp"
30 | sponsor.twitter = "CyberAgentInc"
31 | sponsor.logoAssetName = "cyberagent.png"
32 | sponsor.level = .platinum
33 | return sponsor
34 | }(),
35 | "realm" : {
36 | let sponsor = Sponsor()
37 | sponsor.name = "Realm"
38 | sponsor.url = "http://www.realm.io/"
39 | sponsor.displayURL = "realm.io"
40 | sponsor.twitter = "Realm"
41 | sponsor.logoAssetName = "realm.png"
42 | sponsor.level = .platinum
43 | return sponsor
44 | }(),
45 | "recruit" : {
46 | let sponsor = Sponsor()
47 | sponsor.name = "Recruit Marketing Partners"
48 | sponsor.url = "http://www.recruit-mp.co.jp/career_engineer/"
49 | sponsor.displayURL = "recruit-mp.co.jp"
50 | sponsor.logoAssetName = "recruit_marketing_partners.png"
51 | sponsor.level = .platinum
52 | return sponsor
53 | }(),
54 | "yahoo" : {
55 | let sponsor = Sponsor()
56 | sponsor.name = "Yahoo! JAPAN"
57 | sponsor.url = "http://www.yahoo.co.jp"
58 | sponsor.displayURL = "yahoo.co.jp"
59 | sponsor.logoAssetName = "yahoo.png"
60 | sponsor.level = .platinum
61 | return sponsor
62 | }(),
63 | "line" : {
64 | let sponsor = Sponsor()
65 | sponsor.name = "LINE"
66 | sponsor.url = "https://linecorp.com/ja/"
67 | sponsor.displayURL = "linecorp.com"
68 | sponsor.logoAssetName = "line.png"
69 | sponsor.level = .platinum
70 | return sponsor
71 | }(),
72 |
73 | //Gold
74 | "speee" : {
75 | let sponsor = Sponsor()
76 | sponsor.name = "Speee"
77 | sponsor.url = "http://www.speee.jp"
78 | sponsor.displayURL = "speee.jp"
79 | sponsor.twitter = "speee_pr"
80 | sponsor.logoAssetName = "speee.png"
81 | sponsor.level = .gold
82 | return sponsor
83 | }(),
84 | "casareal" : {
85 | let sponsor = Sponsor()
86 | sponsor.name = "casareal"
87 | sponsor.url = "https://www.casareal.co.jp"
88 | sponsor.displayURL = "casareal.co.jp"
89 | sponsor.logoAssetName = "casareal.png"
90 | sponsor.level = .gold
91 | return sponsor
92 | }(),
93 | "cookpad" : {
94 | let sponsor = Sponsor()
95 | sponsor.name = "Cookpad"
96 | sponsor.url = "https://info.cookpad.com"
97 | sponsor.displayURL = "cookpad.com"
98 | sponsor.twitter = "cookpad_pr"
99 | sponsor.logoAssetName = "cookpad.png"
100 | sponsor.level = .gold
101 | return sponsor
102 | }(),
103 | "firebase" : {
104 | let sponsor = Sponsor()
105 | sponsor.name = "Firebase"
106 | sponsor.url = "http://www.firebase.com/"
107 | sponsor.displayURL = "firebase.com"
108 | sponsor.twitter = "Firebase"
109 | sponsor.logoAssetName = "firebase.png"
110 | sponsor.level = .gold
111 | return sponsor
112 | }(),
113 | "laiso" : {
114 | let sponsor = Sponsor()
115 | sponsor.name = "laiso"
116 | sponsor.url = "http://www.github.com/laiso"
117 | sponsor.displayURL = "github.com/laiso"
118 | sponsor.twitter = "laiso"
119 | sponsor.logoAssetName = "laiso.png"
120 | sponsor.level = .gold
121 | return sponsor
122 | }(),
123 | "moneyforward" : {
124 | let sponsor = Sponsor()
125 | sponsor.name = "Money Forward"
126 | sponsor.url = "https://moneyforward.com"
127 | sponsor.displayURL = "moneyforward.com"
128 | sponsor.twitter = "moneyforward"
129 | sponsor.logoAssetName = "moneyforward.png"
130 | sponsor.level = .gold
131 | return sponsor
132 | }(),
133 | "sansan" : {
134 | let sponsor = Sponsor()
135 | sponsor.name = "Sansan"
136 | sponsor.url = "https://jp.corp-sansan.com"
137 | sponsor.displayURL = "corp-sansan.com"
138 | sponsor.twitter = "sansan_pr"
139 | sponsor.logoAssetName = "sansan.png"
140 | sponsor.level = .gold
141 | return sponsor
142 | }(),
143 | "mercari" : {
144 | let sponsor = Sponsor()
145 | sponsor.name = "Mercari"
146 | sponsor.url = "https://www.mercari.com"
147 | sponsor.displayURL = "mercari.com"
148 | sponsor.twitter = "mercari_app"
149 | sponsor.logoAssetName = "mercari.png"
150 | sponsor.level = .gold
151 | return sponsor
152 | }(),
153 | "balto" : {
154 | let sponsor = Sponsor()
155 | sponsor.name = "Balto (Goodpatch Inc.)"
156 | sponsor.url = "http://www.balto.io/"
157 | sponsor.displayURL = "balto.io"
158 | sponsor.twitter = "balto_appjp"
159 | sponsor.logoAssetName = "balto.png"
160 | sponsor.level = .gold
161 | return sponsor
162 | }(),
163 |
164 | //Silver
165 | "furyu" : {
166 | let sponsor = Sponsor()
167 | sponsor.name = "FuRyu"
168 | sponsor.url = "http://www.saiyo.furyu.jp"
169 | sponsor.displayURL = "saiyo.furyu.jp"
170 | sponsor.logoAssetName = "furyu.png"
171 | sponsor.level = .silver
172 | return sponsor
173 | }(),
174 | "player" : {
175 | let sponsor = Sponsor()
176 | sponsor.name = "Player! (ookami Inc.)"
177 | sponsor.url = "http://www.playerapp.tokyo"
178 | sponsor.displayURL = "playerapp.tokyo"
179 | sponsor.logoAssetName = "player.png"
180 | sponsor.level = .silver
181 | return sponsor
182 | }(),
183 | "ubiregi" : {
184 | let sponsor = Sponsor()
185 | sponsor.name = "Ubiregi"
186 | sponsor.url = "https://ubiregi.com"
187 | sponsor.displayURL = "ubiregi.com"
188 | sponsor.twitter = "ubiregi"
189 | sponsor.logoAssetName = "ubiregi.png"
190 | sponsor.level = .silver
191 | return sponsor
192 | }(),
193 | "freee" : {
194 | let sponsor = Sponsor()
195 | sponsor.name = "freee"
196 | sponsor.url = "https://corp.freee.co.jp"
197 | sponsor.displayURL = "corp.freee.co.jp"
198 | sponsor.twitter = "freee_jp"
199 | sponsor.logoAssetName = "freee.png"
200 | sponsor.level = .silver
201 | return sponsor
202 | }(),
203 | "ohako" : {
204 | let sponsor = Sponsor()
205 | sponsor.name = "OHAKO"
206 | sponsor.url = "http://ohako-inc.jp"
207 | sponsor.displayURL = "ohako-inc.jp"
208 | sponsor.logoAssetName = "ohako.png"
209 | sponsor.level = .silver
210 | return sponsor
211 | }(),
212 | "hatena" : {
213 | let sponsor = Sponsor()
214 | sponsor.name = "Hatena"
215 | sponsor.url = "http://hatenacorp.jp"
216 | sponsor.displayURL = "hatenacorp.jp"
217 | sponsor.logoAssetName = "hatena.png"
218 | sponsor.level = .silver
219 | return sponsor
220 | }(),
221 | "prtimes" : {
222 | let sponsor = Sponsor()
223 | sponsor.name = "PR TIMES"
224 | sponsor.url = "http://prtimes.co.jp"
225 | sponsor.displayURL = "prtimes.co.jp"
226 | sponsor.logoAssetName = "prtimes.png"
227 | sponsor.level = .silver
228 | return sponsor
229 | }(),
230 | "kytrade" : {
231 | let sponsor = Sponsor()
232 | sponsor.name = "KY TRADE"
233 | sponsor.url = "http://www.kytrade.co.jp"
234 | sponsor.displayURL = "kytrade.co.jp"
235 | sponsor.logoAssetName = "kytrade.png"
236 | sponsor.level = .silver
237 | return sponsor
238 | }(),
239 | "gmo" : {
240 | let sponsor = Sponsor()
241 | sponsor.name = "GMO Pepabo"
242 | sponsor.url = "https://pepabo.com"
243 | sponsor.displayURL = "pepabo.com"
244 | sponsor.logoAssetName = "gmopepabo.png"
245 | sponsor.level = .silver
246 | return sponsor
247 | }(),
248 | "fyusion" : {
249 | let sponsor = Sponsor()
250 | sponsor.name = "Fyusion"
251 | sponsor.url = "http://www.fyusion.com"
252 | sponsor.displayURL = "fyusion.com"
253 | sponsor.logoAssetName = "fyusion.png"
254 | sponsor.level = .silver
255 | return sponsor
256 | }(),
257 | "caraquri" : {
258 | let sponsor = Sponsor()
259 | sponsor.name = "Caraquri"
260 | sponsor.url = "http://caraquri.com/"
261 | sponsor.displayURL = "caraquri.com"
262 | sponsor.logoAssetName = "caraquri.png"
263 | sponsor.level = .silver
264 | return sponsor
265 | }(),
266 | "payjp" : {
267 | let sponsor = Sponsor()
268 | sponsor.name = "PAY.JP (BASE,Inc.)"
269 | sponsor.url = "https://pay.jp/"
270 | sponsor.displayURL = "pay.jp/"
271 | sponsor.logoAssetName = "payjp.png"
272 | sponsor.level = .silver
273 | return sponsor
274 | }(),
275 |
276 | // Student
277 | "cyberagent-student" : {
278 | let sponsor = Sponsor()
279 | sponsor.name = "CyberAgent"
280 | sponsor.url = "http://www.cyberagent.co.jp/"
281 | sponsor.displayURL = "cyberagent.co.jp"
282 | sponsor.twitter = "CyberAgentInc"
283 | sponsor.logoAssetName = "cyberagent.png"
284 | sponsor.level = .student
285 | return sponsor
286 | }(),
287 | "prtimes-student" : {
288 | let sponsor = Sponsor()
289 | sponsor.name = "PR TIMES"
290 | sponsor.url = "http://prtimes.co.jp"
291 | sponsor.displayURL = "prtimes.co.jp"
292 | sponsor.logoAssetName = "prtimes.png"
293 | sponsor.level = .student
294 | return sponsor
295 | }(),
296 | "sansan-student" : {
297 | let sponsor = Sponsor()
298 | sponsor.name = "Sansan"
299 | sponsor.url = "https://jp.corp-sansan.com"
300 | sponsor.displayURL = "corp-sansan.com"
301 | sponsor.twitter = "sansan_pr"
302 | sponsor.logoAssetName = "sansan.png"
303 | sponsor.level = .student
304 | return sponsor
305 | }(),
306 | "mercari-student" : {
307 | let sponsor = Sponsor()
308 | sponsor.name = "Mercari"
309 | sponsor.url = "https://www.mercari.com"
310 | sponsor.displayURL = "mercari.com"
311 | sponsor.twitter = "mercari_app"
312 | sponsor.logoAssetName = "mercari.png"
313 | sponsor.level = .student
314 | return sponsor
315 | }(),
316 |
317 | // Event
318 | "meetup" : {
319 | let sponsor = Sponsor()
320 | sponsor.name = "Meetup"
321 | sponsor.url = "https://www.meetup.com"
322 | sponsor.displayURL = "meetup.com"
323 | sponsor.twitter = "meetup"
324 | sponsor.logoAssetName = "meetup.png"
325 | sponsor.level = .event
326 | return sponsor
327 | }(),
328 | "oisix" : {
329 | let sponsor = Sponsor()
330 | sponsor.name = "Oisix"
331 | sponsor.url = "http://www.oisix.co.jp"
332 | sponsor.displayURL = "oisix.co.jp"
333 | sponsor.twitter = "oisix_com"
334 | sponsor.logoAssetName = "oisix.png"
335 | sponsor.level = .event
336 | return sponsor
337 | }(),
338 | "polidea" : {
339 | let sponsor = Sponsor()
340 | sponsor.name = "Polidea"
341 | sponsor.url = "https://www.polidea.com"
342 | sponsor.displayURL = "polidea.com"
343 | sponsor.twitter = "polidea"
344 | sponsor.logoAssetName = "polidea.png"
345 | sponsor.level = .event
346 | return sponsor
347 | }(),
348 | "2-3works" : {
349 | let sponsor = Sponsor()
350 | sponsor.name = "2-3 Works"
351 | sponsor.url = "http://2-3works.tokyo"
352 | sponsor.displayURL = "2-3works.tokyo"
353 | sponsor.twitter = "yucovin"
354 | sponsor.logoAssetName = "2-3works.png"
355 | sponsor.level = .event
356 | return sponsor
357 | }(),
358 | "pivotal" : {
359 | let sponsor = Sponsor()
360 | sponsor.name = "Pivotal"
361 | sponsor.url = "https://pivotal.io"
362 | sponsor.displayURL = "pivotal.io"
363 | sponsor.twitter = "pivotal"
364 | sponsor.logoAssetName = "pivotal.png"
365 | sponsor.level = .event
366 | return sponsor
367 | }(),
368 | "ninedrafts" : {
369 | let sponsor = Sponsor()
370 | sponsor.name = "Nine Drafts"
371 | sponsor.url = "https://www.facebook.com/9drafts/"
372 | sponsor.displayURL = "facebook.com/9drafts/"
373 | sponsor.logoAssetName = "ninedrafts.png"
374 | sponsor.level = .event
375 | return sponsor
376 | }(),
377 | "appdojo" : {
378 | let sponsor = Sponsor()
379 | sponsor.name = "アプリクリエイター道場"
380 | sponsor.url = "http://app-dojo.jp"
381 | sponsor.displayURL = "app-dojo.jp"
382 | sponsor.twitter = "appcreatordojo"
383 | sponsor.logoAssetName = "appcreatordojo.png"
384 | sponsor.level = .event
385 | return sponsor
386 | }()
387 | ]
388 |
389 |
--------------------------------------------------------------------------------
/Example/Tests/NYC-2017/TKO2017Venues.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Venues.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RealmSwift
11 | import TrySwiftData
12 |
13 | public let tko2017Venues: [String : Venue] = [
14 | "bellesalle-shinjuku" : {
15 | let venue = Venue()
16 | venue.title = "BELLESALLE Shinjuku Central Park"
17 | venue.titleJP = "ベルサール新宿セントラルパーク"
18 | venue.address = "6-13-1, Nishishinjuku , Shinjuku-ku, Tokyo, 160-0023"
19 | venue.addressJP = "〒160-0023 東京都新宿区西新宿6-13-1"
20 | venue.website = "http://www.bellesalle.co.jp/room/bs_shinjuku/"
21 | venue.logoAssetName = "bs_shinjuku.jpg"
22 | venue.wifiNetworkName = "try_Swift_Tokyo"
23 | venue.wifiPassword = "tryswifttokyo"
24 | venue.type = .conference
25 | return venue
26 | }(),
27 | "bellesalle-kanda" : {
28 | let venue = Venue()
29 | venue.title = "BELLESALLE Kanda"
30 | venue.titleJP = "ベルサール神田"
31 | venue.address = "7, Kandamitoshirocho, Chiyoda-ku, Tokyo, 101-0053"
32 | venue.addressJP = "〒101-0053 東京都千代田区神田美土代町7住友不動産神田ビル2・3F"
33 | venue.website = "http://www.bellesalle.co.jp/room/bs_kanda/"
34 | venue.logoAssetName = "bs_kanda.jpg"
35 | venue.wifiNetworkName = "try_Swift_Tokyo"
36 | venue.wifiPassword = "tryswifttokyo"
37 | venue.type = .hackathon
38 | return venue
39 | }(),
40 | "christon" : {
41 | let venue = Venue()
42 | venue.title = "Christon Cafe"
43 | venue.titleJP = "キリストンカフェ 東京"
44 | venue.address = "5-17-13 8F, Shinjuku, Shinjuku-ku, Tokyo, 160-0022"
45 | venue.addressJP = "〒160-0022 東京都新宿区新宿5-17-13 オリエンタルウェーブ8F"
46 | venue.website = "http://chiristoncafe-shinjuku.com"
47 | venue.logoAssetName = "christon_cafe.jpg"
48 | venue.twitter = "christoncafe"
49 | venue.wifiNetworkName = "CHRISTON"
50 | venue.type = .party
51 | return venue
52 | }(),
53 | ]
54 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/AnnouncementSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnnouncementSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/25/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | class AnnouncementSessionViewModelTests: XCTestCase {
13 |
14 | fileprivate let conference = Conference.current
15 | fileprivate let announcement = {
16 | return Session.all.filter { $0.value.type == SessionType.announcement }.first!.value
17 | }()
18 | fileprivate var viewModel: SessionViewModel!
19 |
20 | override func setUp() {
21 | viewModel = SessionViewModel(session: announcement)
22 | }
23 |
24 | func testTitle() {
25 | XCTAssertEqual( viewModel.title, announcement.title)
26 | }
27 |
28 | func testPresenter() {
29 | XCTAssertEqual(viewModel.presenter, "try! Conference")
30 | }
31 |
32 | func testImageURL() {
33 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, announcement.imageAssetName)
34 | }
35 |
36 | func testLocation() {
37 | XCTAssertEqual(viewModel.location, announcement.location!.name)
38 | }
39 |
40 | func testShortDescription() {
41 | XCTAssertEqual(viewModel.shortDescription, "📣")
42 | }
43 |
44 | func testLongDescription() {
45 | XCTAssertEqual(viewModel.longDescription, conference.localizedDescription)
46 | }
47 |
48 | func testSelectable() {
49 | XCTAssertFalse(viewModel.selectable)
50 | }
51 |
52 | func testTwitter() {
53 | XCTAssertEqual(viewModel.twitter, "@\(conference.twitter)")
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/BreakfastSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreakfastSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/25/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | class BreakfastSessionViewModelTests: XCTestCase {
13 |
14 | fileprivate let conference = Conference.current
15 | fileprivate let breakfast = {
16 | return Session.all.filter { $0.value.type == SessionType.breakfast }.first!.value
17 | }()
18 | fileprivate var viewModel: SessionViewModel!
19 |
20 | override func setUp() {
21 | viewModel = SessionViewModel(session: breakfast)
22 | }
23 |
24 | func testTitle() {
25 | XCTAssertEqual( viewModel.title, breakfast.title)
26 | }
27 |
28 | func testPresenter() {
29 | XCTAssertEqual(viewModel.presenter, "try! Conference")
30 | }
31 |
32 | func testImageURL() {
33 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, breakfast.imageAssetName)
34 | }
35 |
36 | func testLocation() {
37 | XCTAssertEqual(viewModel.location, breakfast.location!.name)
38 | }
39 |
40 | func testShortDescription() {
41 | XCTAssertEqual(viewModel.shortDescription, "❤️")
42 | }
43 |
44 | func testLongDescription() {
45 | XCTAssertEqual(viewModel.longDescription, conference.localizedDescription)
46 | }
47 |
48 | func testSelectable() {
49 | XCTAssertFalse(viewModel.selectable)
50 | }
51 |
52 | func testTwitter() {
53 | XCTAssertEqual(viewModel.twitter, "@\(conference.twitter)")
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/CoffeeBreakSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CoffeeBreakSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/25/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | /*
13 | class CoffeeBreakSessionViewModelTests: XCTestCase {
14 |
15 | fileprivate let conference = Conference.current
16 |
17 | fileprivate let coffeeBreak = {
18 | return Session.all.filter { $0.value.type == SessionType.coffeeBreak }.first!.value
19 | }()
20 | fileprivate var viewModel: SessionViewModel!
21 |
22 | // fileprivate let sponsoredCoffeeBreak = nyc2016Sessions["day2FirstCoffee"]!
23 | // fileprivate var viewModelWithSponsor: SessionViewModel!
24 |
25 | override func setUp() {
26 | viewModel = SessionViewModel(session: coffeeBreak)
27 | // viewModelWithSponsor = SessionViewModel(session: sponsoredCoffeeBreak)
28 | }
29 |
30 | func testTitle_noSponsor() {
31 | XCTAssertEqual( viewModel.title, "Coffee Break")
32 | }
33 |
34 | // func testTitle_withSponsor() {
35 | // XCTAssertEqual( viewModelWithSponsor.title, "Coffee Break, by \(sponsoredCoffeeBreak.sponsor!.name)")
36 | // }
37 |
38 | func testPresenter_noSponsor() {
39 | XCTAssertEqual(viewModel.presenter, "try! Conference")
40 | }
41 |
42 | // func testPresenter_withSponsor() {
43 | // XCTAssertEqual(viewModelWithSponsor.presenter, sponsoredCoffeeBreak.sponsor!.name)
44 | // }
45 |
46 | func testImageURL_noSponsor() {
47 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, coffeeBreak.imageAssetName)
48 | }
49 |
50 | func testLocation() {
51 | XCTAssertEqual(viewModel.location, coffeeBreak.location!.name)
52 | }
53 |
54 | func testShortDescription() {
55 | XCTAssertEqual(viewModel.shortDescription, "❤️")
56 | }
57 |
58 | func testLongDescription() {
59 | XCTAssertEqual(viewModel.longDescription, conference.localizedDescription)
60 | }
61 |
62 | func testSelectable_noSponsor() {
63 | XCTAssertFalse(viewModel.selectable)
64 | }
65 |
66 | // func testSelectable_withSponsor() {
67 | // XCTAssertTrue(viewModelWithSponsor.selectable)
68 | // }
69 |
70 | func testTwitter_noSponsor() {
71 | XCTAssertEqual(viewModel.twitter, "@\(conference.twitter!)")
72 | }
73 |
74 | // func testTwitter_withSponsor() {
75 | // XCTAssertEqual(viewModelWithSponsor.twitter, "@\(sponsoredCoffeeBreak.sponsor!.twitter!)")
76 | // }
77 |
78 | }
79 | */
80 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/LightningTalkSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LightningTalkSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/25/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | /*
13 | class LightningTalkSessionViewModelTests: XCTestCase {
14 |
15 | fileprivate let conference = Conference.current
16 |
17 | fileprivate let lightningTalk = {
18 | return Session.all.filter { $0.value.type == SessionType.lightningTalk }.first!.value
19 | }()
20 |
21 | fileprivate var viewModel: SessionViewModel!
22 | fileprivate var presentation: Presentation!
23 |
24 | fileprivate var viewModelNoPresentation: SessionViewModel!
25 |
26 | override func setUp() {
27 | viewModel = SessionViewModel(session: lightningTalk)
28 | presentation = lightningTalk.presentation!
29 | viewModelNoPresentation = SessionViewModel(session: lightningTalk)
30 | }
31 |
32 | func testTitle() {
33 | XCTAssertEqual( viewModel.title, presentation.localizedTitle)
34 | }
35 |
36 | func testTitle_noPresentation() {
37 | XCTAssertEqual(viewModelNoPresentation.title, "TBD")
38 |
39 | }
40 |
41 | func testPresenter() {
42 | XCTAssertEqual(viewModel.presenter, presentation.speaker!.localizedName)
43 | }
44 |
45 | func testPresenter_noPresentation() {
46 | // XCTAssertEqual(viewModelNoPresentation.presenter, "TBD")
47 | }
48 |
49 | func testImageURL() {
50 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, presentation.speaker!.imageAssetName)
51 | }
52 |
53 | func testImageURL_noPresentation() {
54 | // XCTAssertEqual(viewModelNoPresentation.imageURL.lastPathComponent, "Logo_TKO.png")
55 | }
56 |
57 | func testLocation() {
58 | XCTAssertEqual(viewModel.location, lightningTalk.location!.name)
59 | }
60 |
61 | func testShortDescription() {
62 | XCTAssertEqual(viewModel.shortDescription, "⚡️🎤 Lightning Talk")
63 | }
64 |
65 | func testLongDescription() {
66 | XCTAssertEqual(viewModel.longDescription, presentation!.localizedSummary)
67 | }
68 |
69 | func testLongDescription_noPresentation() {
70 | // XCTAssertEqual(viewModelNoPresentation.longDescription, conference.localizedDescription)
71 | }
72 |
73 | func testSelectable() {
74 | XCTAssertTrue(viewModel.selectable)
75 | }
76 |
77 | func testSelectable_noPresentation() {
78 | XCTAssertFalse(viewModelNoPresentation.selectable)
79 | }
80 |
81 | func testTwitter() {
82 | XCTAssertEqual(viewModel.twitter, "@\(presentation.speaker!.twitter)")
83 | }
84 |
85 | func testTwitter_noPresentation() {
86 | XCTAssertEqual(viewModelNoPresentation.twitter, "@\(conference.twitter!)")
87 | }
88 |
89 | }
90 | */
91 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/LunchSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LunchSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Alvin Varghese on 25/03/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | class LunchSessionViewModelTests: XCTestCase {
13 |
14 | fileprivate let conference = Conference.current
15 | fileprivate let lunchSession = {
16 | return Session.all.filter { $0.value.type == SessionType.lunch }.first!.value
17 | }()
18 | fileprivate var viewModel: SessionViewModel!
19 |
20 | override func setUp() {
21 | viewModel = SessionViewModel(session: lunchSession)
22 | }
23 |
24 | func testTitle() {
25 | XCTAssertEqual( viewModel.title, "Lunch")
26 | }
27 |
28 | func testPresenter() {
29 | XCTAssertEqual( viewModel.presenter, "try! Conference")
30 | }
31 |
32 | func testImageURL() {
33 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, lunchSession.imageAssetName)
34 | }
35 |
36 | func testShortDescription() {
37 | XCTAssertEqual(viewModel.shortDescription, "🌯")
38 | }
39 |
40 | func testLocation() {
41 | XCTAssertEqual(viewModel.location, lunchSession.location?.name)
42 | }
43 |
44 | func testLongDescription() {
45 | XCTAssertEqual(viewModel.longDescription, conference.localizedDescription)
46 | }
47 |
48 | func testSelectable() {
49 | XCTAssertFalse(viewModel.selectable)
50 | }
51 |
52 | func testTwitter() {
53 | XCTAssertEqual(viewModel.twitter, "@\(conference.twitter)")
54 | }
55 | }
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/MeetupSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MeetupSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Alvin Varghese on 26/03/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | //import XCTest
10 | //import TrySwiftData
11 | //
12 | //class MeetupSessionViewModelTests: XCTestCase {
13 | //
14 | // //MARK: Local Variables
15 | //
16 | // fileprivate let meetupSession = nyc2016Sessions["preconfmeetup"]!
17 | // fileprivate var viewModel: SessionViewModel!
18 | //
19 | // // No Event
20 | //
21 | // fileprivate var viewModel_NoEvent: SessionViewModel!
22 | //
23 | // // No Sponsor
24 | //
25 | // fileprivate var viewModel_NoSponsor: SessionViewModel!
26 | //
27 | // //MARK: Setup
28 | //
29 | // override func setUp() {
30 | //
31 | // viewModel = SessionViewModel(session: meetupSession)
32 | //
33 | // // No Event
34 | //
35 | // let session_NoEvent = Session()
36 | // session_NoEvent.type = .meetup
37 | // session_NoEvent.sponsor = Sponsor()
38 | // session_NoEvent.location?.name = Venue.localizedName(for: .conference)
39 | // let meetupSession_NoEvent = session_NoEvent
40 | // viewModel_NoEvent = SessionViewModel(session: meetupSession_NoEvent)
41 | //
42 | // // No Sponsor
43 | //
44 | // let session_NoSponsor = Session()
45 | // session_NoSponsor.type = .meetup
46 | // session_NoSponsor.event = nyc2016Events["meetup"]
47 | // session_NoSponsor.sponsor = nil
48 | // viewModel_NoSponsor = SessionViewModel(session: session_NoSponsor)
49 | // }
50 | //
51 | // //MARK: Event Title
52 | //
53 | // func test_EventTitle() {
54 | // XCTAssertEqual( viewModel.title, meetupSession.event?.title)
55 | // }
56 | //
57 | // //MARK: Default Title - No Event
58 | //
59 | // func test_DefaultTitle() {
60 | // XCTAssertEqual( viewModel_NoEvent.title, "TBD")
61 | // }
62 | //
63 | // //MARK: Subtitle
64 | //
65 | // func testPresenter() {
66 | // XCTAssertEqual( viewModel.presenter, meetupSession.sponsor?.localizedName)
67 | // }
68 | //
69 | // //MARK: Subtitle - No Sponsor
70 | //
71 | // func testPresenter_NoSponsor() {
72 | // XCTAssertEqual( viewModel_NoSponsor.presenter, "try! Conference")
73 | // }
74 | //
75 | // // Problem - There are no assets for New York, so Logo URL test wont work
76 | //
77 | //// //MARK: Logo URL
78 | ////
79 | //// func testLogoURL() {
80 | //// XCTAssertEqual(viewModel.logoURL.lastPathComponent, meetupSession.event?.logoAssetName)
81 | //// }
82 | //
83 | // func testShortDescription() {
84 | // XCTAssertEqual(viewModel.shortDescription, "Special Event")
85 | // }
86 | //
87 | // func testLocation() {
88 | // XCTAssertEqual(viewModel.location, meetupSession.event?.localizedLocation)
89 | // }
90 | //
91 | // func testLocation_NoEvent() {
92 | // XCTAssertEqual(viewModel_NoEvent.location, "Conference")
93 | // }
94 | //
95 | // func testLongDescription() {
96 | // XCTAssertEqual(viewModel.longDescription, Conference.current.localizedDescription)
97 | // }
98 | //
99 | // func testSelectable() {
100 | // XCTAssertFalse(meetupSession.event == nil)
101 | // }
102 | //
103 | // func testTwitter() {
104 | // XCTAssertEqual(viewModel.twitter, "@\(meetupSession.sponsor!.twitter!)")
105 | // }
106 | //
107 | // func testTwitter_NoSponsor() {
108 | // XCTAssertEqual(viewModel_NoSponsor.twitter, "@\(Conference.current.twitter!)")
109 | // }
110 | //
111 | // func test_NoTwitter_ButThereIsASponsor() {
112 | // XCTAssertEqual(viewModel_NoEvent.twitter, "@tryswiftconf")
113 | // }
114 | //}
115 |
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/OfficeHoursSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OfficeHoursSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/26/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 | /*
12 | class OfficeHoursSessionViewModelTests: XCTestCase {
13 |
14 | fileprivate let conference = Conference.current
15 |
16 | fileprivate let officeHours = {
17 | return Session.all.filter { $0.value.type == SessionType.officeHours }.first!.value
18 | }()
19 | fileprivate var speaker: Speaker!
20 |
21 | fileprivate var viewModel: SessionViewModel!
22 |
23 | fileprivate var viewModel_noSpeaker: SessionViewModel!
24 |
25 | override func setUp() {
26 | viewModel = SessionViewModel(session: officeHours)
27 | speaker = officeHours.presentation!.speaker
28 | viewModel_noSpeaker = SessionViewModel(session: officeHours)
29 | }
30 |
31 | func testTitle_withSpeaker() {
32 | XCTAssertEqual( viewModel.title, "Office Hours with \(speaker.name)")
33 | }
34 |
35 | func testTitle_noSpeaker() {
36 | XCTAssertEqual( viewModel_noSpeaker.title, "Office Hours")
37 | }
38 |
39 | func testPresenter_withSpeaker() {
40 | XCTAssertEqual(viewModel.presenter, speaker.localizedName)
41 | }
42 |
43 | func testPresenter_noSpeaker() {
44 | XCTAssertEqual(viewModel_noSpeaker.presenter, "⁉️")
45 | }
46 |
47 | // func testImageURL() {
48 | // XCTAssertEqual(viewModel.imageURL.lastPathComponent, speaker.imageAssetName)
49 | // }
50 |
51 | func testLocation() {
52 | XCTAssertEqual(viewModel.location, officeHours.location!.name)
53 | }
54 |
55 | func testShortDescription() {
56 | XCTAssertEqual(viewModel.shortDescription, "Q&A")
57 | }
58 |
59 | func testLongDescription_withSpeaker() {
60 | XCTAssertEqual(viewModel.longDescription, speaker.localizedBio)
61 | }
62 |
63 | func testLongDescription_noSpeaker() {
64 | XCTAssertEqual(viewModel_noSpeaker.longDescription, conference.localizedDescription)
65 | }
66 |
67 | func testSelectable() {
68 | XCTAssertTrue(viewModel.selectable)
69 | }
70 |
71 | func testTwitter_withSpeaker() {
72 | XCTAssertEqual(viewModel.twitter, "@\(speaker.twitter)")
73 | }
74 |
75 | func testTwitter_noSpeaker() {
76 | XCTAssertEqual(viewModel_noSpeaker.twitter, "@\(conference.twitter)")
77 | }
78 |
79 | }
80 | */
81 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/PartySessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PartySessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Alvin Varghese on 26/03/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | /*
13 | class PartySessionViewModelTests: XCTestCase {
14 |
15 | fileprivate let partySession = {
16 | return Session.all.filter { $0.value.type == SessionType.party }.first!.value
17 | }()
18 | fileprivate var viewModel: SessionViewModel!
19 |
20 | override func setUp() {
21 | viewModel = SessionViewModel(session: partySession)
22 | }
23 |
24 | func testTitle() {
25 | XCTAssertEqual( viewModel.title, partySession.title)
26 | }
27 |
28 | func testPresenter() {
29 | XCTAssertEqual( viewModel.presenter, "try! Conference")
30 | }
31 |
32 | func testImageURL() {
33 | XCTAssertEqual(viewModel.imageURL.lastPathComponent, partySession.imageAssetName)
34 | }
35 |
36 | func testShortDescription() {
37 | XCTAssertEqual(viewModel.shortDescription, "🎉🎉🎉")
38 | }
39 |
40 | func testLocation() {
41 | XCTAssertEqual(viewModel.location, partySession.venue?.localizedTitle)
42 | }
43 |
44 | func testSummay() {
45 | XCTAssertEqual(viewModel.longDescription, Conference.current.localizedDescription)
46 | }
47 |
48 | func testSelectable() {
49 | XCTAssertTrue(viewModel.selectable)
50 | }
51 |
52 | func testTwitter() {
53 | XCTAssertEqual(viewModel.twitter, Conference.current.twitter)
54 | }
55 | }
56 | */
57 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/SessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SessionDataValidationTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/26/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | class SessionViewModelTests: XCTestCase {
13 |
14 | func testsessionData() {
15 | let sessions = Session.all.map { $0.1 }
16 | sessions.forEach {
17 | let viewModel = SessionViewModel(session: $0)
18 | XCTAssertNotNil(viewModel)
19 | }
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/SponsoredDemoSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SponsoredDemoSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/26/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | //import XCTest
10 | //import TrySwiftData
11 | //
12 | //class SponsoredDemoSessionViewModelTests: XCTestCase {
13 | //
14 | // fileprivate let sponsoredDemo = nyc2016Sessions["day3SponsoredDemo"]!
15 | // fileprivate var viewModel: SessionViewModel!
16 | // fileprivate var sponsor: Sponsor!
17 | //
18 | // override func setUp() {
19 | // viewModel = SessionViewModel(session: sponsoredDemo)
20 | // sponsor = sponsoredDemo.sponsor!
21 | // }
22 | //
23 | // func testTitle() {
24 | // XCTAssertEqual(viewModel.title, "Sponsored Demo")
25 | // }
26 | //
27 | // func testPresenter() {
28 | // XCTAssertEqual( viewModel.presenter, sponsor.localizedName)
29 | // }
30 | //
31 | // func testShortDescription() {
32 | // XCTAssertEqual(viewModel.shortDescription, "Demo")
33 | // }
34 | //
35 | // func testLocation() {
36 | // XCTAssertEqual(viewModel.location, sponsoredDemo.location?.localizedName)
37 | // }
38 | //
39 | // func testLongDescription() {
40 | // XCTAssertEqual(viewModel.longDescription, Conference.current.localizedDescription)
41 | // }
42 | //
43 | // func testSelectable() {
44 | // XCTAssertTrue(viewModel.selectable)
45 | // }
46 | //
47 | // func testTwitter() {
48 | // XCTAssertEqual(viewModel.twitter, "@\(sponsor.twitter!)")
49 | // }
50 | //}
51 |
52 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/TalkSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TalkSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Natasha Murashev on 3/26/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 | /*
13 | class TalkSessionViewModelTests: XCTestCase {
14 |
15 | fileprivate let conference = Conference.current
16 |
17 | fileprivate let talk = {
18 | return Session.all.filter { $0.value.type == SessionType.talk }.first!.value
19 | }()
20 |
21 | fileprivate var viewModel: SessionViewModel!
22 | fileprivate var presentation: Presentation!
23 |
24 | override func setUp() {
25 | viewModel = SessionViewModel(session: talk)
26 | presentation = talk.presentation!
27 | }
28 |
29 | func testTitle() {
30 | XCTAssertEqual( viewModel.title, presentation.localizedTitle)
31 | }
32 |
33 | func testPresenter() {
34 | XCTAssertEqual(viewModel.presenter, presentation.speaker!.localizedName)
35 | }
36 |
37 | // func testImageURL() {
38 | // XCTAssertEqual(viewModel.imageURL.lastPathComponent, presentation.speaker!.imageAssetName)
39 | // }
40 |
41 | func testLocation() {
42 | XCTAssertEqual(viewModel.location, talk.location!.name)
43 | }
44 |
45 | func testShortDescription() {
46 | XCTAssertEqual(viewModel.shortDescription, "Presentation")
47 | }
48 |
49 | func testLongDescription() {
50 | XCTAssertEqual(viewModel.longDescription, presentation!.localizedSummary)
51 | }
52 |
53 | func testSelectable() {
54 | XCTAssertTrue(viewModel.selectable)
55 | }
56 |
57 | func testTwitter() {
58 | XCTAssertEqual(viewModel.twitter, "@\(presentation.speaker!.twitter)")
59 | }
60 | }
61 | */
62 |
--------------------------------------------------------------------------------
/Example/Tests/SessionTests/WorkshopSessionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WorkshopSessionViewModelTests.swift
3 | // trySwiftData
4 | //
5 | // Created by Alvin Varghese on 26/03/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import TrySwiftData
11 |
12 |
13 | class WorkshopSessionViewModelTests: XCTestCase {
14 |
15 | //MARK: Local Variables
16 |
17 | fileprivate let workshopSession = {
18 | return Session.all.filter { $0.value.type == SessionType.workshop }.first!.value
19 | }()
20 | fileprivate var viewModel: SessionViewModel!
21 |
22 | // No Event
23 |
24 | fileprivate var viewModel_NoEvent: SessionViewModel!
25 |
26 | // No Sponsor
27 |
28 | fileprivate var viewModel_NoSponsor: SessionViewModel!
29 |
30 | override func setUp() {
31 |
32 | viewModel = SessionViewModel(session: workshopSession)
33 |
34 | // No Event
35 |
36 | // let session_NoEvent = Session()
37 | // session_NoEvent.type = .meetup
38 | // session_NoEvent.sponsor = Sponsor()
39 | // session_NoEvent.location?.name = Venue.localizedName(for: .conference)
40 | // let workshopSession_NoEvent = session_NoEvent
41 | // viewModel_NoEvent = SessionViewModel(session: workshopSession_NoEvent)
42 | //
43 | // // No Sponsor
44 | //
45 | // let session_NoSponsor = Session()
46 | // session_NoSponsor.type = .meetup
47 | // session_NoSponsor.event = nyc2016Events["gaWorkshop"]
48 | // session_NoSponsor.sponsor = nil
49 | // viewModel_NoSponsor = SessionViewModel(session: session_NoSponsor)
50 | }
51 |
52 | func testTitle_withEvent() {
53 | XCTAssertEqual( viewModel.title, workshopSession.event?.title)
54 | }
55 |
56 | // func testTitle_NoEvent() {
57 | // XCTAssertEqual( viewModel_NoEvent.title, "TBD")
58 | // }
59 |
60 | func testPresenter() {
61 | XCTAssertEqual( viewModel.presenter, workshopSession.sponsor?.localizedName)
62 | }
63 |
64 | // func testPresenter_NoSponsor() {
65 | // XCTAssertEqual( viewModel_NoSponsor.presenter, "try! Conference")
66 | // }
67 |
68 | // Problem - There are no assets for New York, so Logo URL test wont work
69 |
70 | // //MARK: Logo URL
71 | //
72 | // func testLogoURL() {
73 | // XCTAssertEqual(viewModel.logoURL.lastPathComponent, workshopSession.event?.logoAssetName)
74 | // }
75 |
76 |
77 | func testShortDescription() {
78 | XCTAssertEqual(viewModel.shortDescription, "💻")
79 | }
80 |
81 | func testLocation_withEvent() {
82 | XCTAssertEqual(viewModel.location, workshopSession.event?.localizedLocation)
83 | }
84 |
85 | // func testLocation_NoEvent() {
86 | // XCTAssertEqual(viewModel_NoEvent.location, "Conference")
87 | // }
88 |
89 | func testLongDescription() {
90 | XCTAssertEqual(viewModel.longDescription, Conference.current.localizedDescription)
91 | }
92 |
93 | func testSelectable() {
94 | XCTAssertFalse(workshopSession.event == nil)
95 | }
96 |
97 | // func testTwitter() {
98 | // XCTAssertEqual(viewModel.twitter, "@\(workshopSession.sponsor!.twitter!)")
99 | // }
100 |
101 | // func testTwitter_noSponsor() {
102 | // XCTAssertEqual(viewModel_NoSponsor.twitter, "@\(Conference.current.twitter!)")
103 | // }
104 |
105 | // func test_NoTwitter_ButThereIsASponsor() {
106 | // XCTAssertEqual(viewModel_NoEvent.twitter, "@tryswiftconf")
107 | // }
108 |
109 | }
110 |
--------------------------------------------------------------------------------
/Example/TrySwiftData.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Example/TrySwiftData.xcodeproj/xcshareddata/xcschemes/TrySwiftData_Tests.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
14 |
15 |
17 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
39 |
40 |
41 |
42 |
48 |
49 |
51 |
52 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/Example/TrySwiftData.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
12 |
13 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/Example/trySwiftData.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Example/trySwiftData.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2017 Alvin Varghese
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # trySwiftData
2 |
3 | [](https://travis-ci.org/Alvin%20Varghese/trySwiftData)
4 | [](https://cocoapods.org/pods/trySwiftData)
5 | [](https://cocoapods.org/pods/trySwiftData)
6 | [](https://cocoapods.org/pods/trySwiftData)
7 |
8 | ## How to Make Changes
9 | 1. Make the change in the appropriate file in `TrySwiftData` -> `Tests` -> `TKO2017` folder
10 | 2. Run the tests
11 | 3. Check for the printed out message with the newly generated `.realm` file such as `Successfully generated at /Users/natashatherobot/Library/Developer/CoreSimulator/Devices/D8989664-9BC5-4DA7-B5E4-E0A1F9B5AE3F/data/tmp/tryswift-tokyo2017.realm`
12 | 4. Open the printed out folder to get the newly generated `.realm` file
13 | 5. Replace the current `tokyo.realm` file with the newly generated `tokyo.realm` file from the `tmp` folder
14 | 6. Run `pod update` in the try! Swift Final app
15 |
16 | ## Example
17 |
18 | To run the example project, clone the repo, and run `pod install` from the Example directory first.
19 |
20 | ## Requirements
21 |
22 | ## Installation
23 |
24 | trySwiftData is available through [CocoaPods](https://cocoapods.org). To install
25 | it, simply add the following line to your Podfile:
26 |
27 | ```ruby
28 | pod 'trySwiftData', :git => 'https://github.com/tryswift/trySwiftData.git'
29 | ```
30 |
31 | ## Author
32 |
33 | Natasha Murashev, natasha@tryswift.co
34 | Alvin Varghese, alvinvarghese@live.com
35 |
36 | ## License
37 |
38 | trySwiftData is available under the MIT license. See the LICENSE file for more info.
39 |
--------------------------------------------------------------------------------
/TrySwiftData.podspec:
--------------------------------------------------------------------------------
1 | #
2 | # Be sure to run `pod lib lint trySwiftData.podspec' to ensure this is a
3 | # valid spec before submitting.
4 | #
5 | # Any lines starting with a # are optional, but their use is encouraged
6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
7 | #
8 |
9 | Pod::Spec.new do |s|
10 | s.name = 'TrySwiftData'
11 | s.version = '0.1.0'
12 | s.summary = 'TrySwiftData'
13 |
14 | s.description = "trySwiftData"
15 | s.homepage = 'https://github.com/tryswift/trySwiftData.git'
16 | s.license = { :type => 'MIT', :file => 'LICENSE' }
17 | s.author = { 'Alvin Varghese' => 'alvinvarghese@live.com', 'Natasha Murashev' => 'natasha@tryswift.co' }
18 | s.source = { :git => 'https://github.com/tryswift/trySwiftData.git', :tag => s.version.to_s }
19 |
20 | s.ios.deployment_target = '11.0'
21 | s.watchos.deployment_target = '4.0'
22 | s.tvos.deployment_target = '10.1'
23 |
24 | s.frameworks = 'UIKit', 'Foundation'
25 | s.default_subspec = 'TrySwiftAssets'
26 | s.source_files = 'TrySwiftData/**/*.{swift}'
27 |
28 | # For full-scale integration, such as the iOS app
29 | s.subspec 'TrySwiftAssets' do |core|
30 | core.resource_bundles = {
31 | 'TrySwiftData' => ['TrySwiftData/Assets/**/*.strings','TrySwiftData/Assets/Conferences/**/*.{jpg,png,realm}']
32 | }
33 | end
34 |
35 | # For minimal integrations, like the watchOS widget
36 | s.subspec 'Tokyo2017Lite' do |lite|
37 | lite.resource_bundles = {
38 | 'TrySwiftData' => ['TrySwiftData/Assets/**/*.strings', 'TrySwiftData/Assets/Conferences/*.{realm}']
39 | }
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/BLR-2017/Logo_BLR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/BLR-2017/Logo_BLR.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/announce1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/announce1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/announce2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/announce2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/announce_blr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/announce_blr.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/announce_nyc_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/announce_nyc_1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/announce_nyc_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/announce_nyc_2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/bento1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/bento1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/bento2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/bento2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/bowling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/bowling.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/breaktime1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/breaktime1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/breaktime2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/breaktime2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/donuts1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/donuts1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/donuts2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/donuts2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/lunch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/lunch.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/lunch2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/lunch2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/lunch3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/lunch3.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/party1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/party1.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/party2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/party2.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/rikoOrange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/rikoOrange.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/Icons/rikoPurple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/Icons/rikoPurple.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/Logo_NYC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/Logo_NYC.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/WatchLogo_NYC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/WatchLogo_NYC.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/alvin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/alvin.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/daisy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/daisy.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/erica.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/erica.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/jpmarthajp.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/jpmarthajp.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/natasha.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/natasha.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/saraAhmed.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/saraAhmed.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/vaish.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/vaish.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/organizers/yucovin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/organizers/yucovin.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/agora_talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/agora_talk.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/anne.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/anne.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/bosear_talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/bosear_talk.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/brennan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/brennan.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/cate.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/cate.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/dabby.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/dabby.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/dave.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/dave.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/dave_delong.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/dave_delong.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/dr.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/dr.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/eli.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/eli.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/amy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/amy.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/chris.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/chris.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/hector.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/hosts/hector.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/bosearsquare.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/bosearsquare.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/carson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/carson.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/carson_mark.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/carson_mark.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/chris-workshop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/chris-workshop.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/ian.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/ian.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/jonbott.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/jonbott.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/mas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/mas.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/pauls.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/pauls.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/sanjeev.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/sanjeev.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/sanjian.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/instructors/sanjian.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/ish.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/ish.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/jean.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/jean.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/jordan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/jordan.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/kaitlin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/kaitlin.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/kelly.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/kelly.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/laura.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/laura.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/lea.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/lea.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/marc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/marc.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/nick.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/nick.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/paige.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/paige.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/paul.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/paul.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/shai.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/shai.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/soojinro.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/soojinro.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/tom_doron.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/tom_doron.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/twilio_talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/twilio_talk.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/speakers/yuki.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/speakers/yuki.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diamond/wework.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diamond/wework.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/automattic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/automattic.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/lickability.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/lickability.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/diversity/twitter.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/bosear.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/bosear.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/bugsnag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/bugsnag.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/jetbrains.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/jetbrains.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/mongodb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/mongodb.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/twilio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/twilio.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/wayfair.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/gold/wayfair.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/cody.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/cody.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/gett.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/gett.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/orange.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/rift.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/rift.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/tim.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/individual/tim.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/IBM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/IBM.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/agora.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/agora.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/bitrise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/platinum/bitrise.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/sponsors/silver/merrill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/sponsors/silver/merrill.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/venues/frames.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/venues/frames.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/NYC2019/venues/nws.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/NYC2019/venues/nws.jpg
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/SJO-2018/Logo_SJO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/SJO-2018/Logo_SJO.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/TKO-2019/Logo_TKO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/TKO-2019/Logo_TKO.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/TKO-2019/WatchLogo_TKO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/TKO-2019/WatchLogo_TKO.png
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/tryswift.realm.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/tryswift.realm.lock
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.balance.mx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.balance.mx
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.control.mx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.control.mx
--------------------------------------------------------------------------------
/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.write.mx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryswift/trySwiftData/258adbd68d6e3a7ccdb89476575c08fca4a8c68e/TrySwiftData/Assets/Conferences/tryswift.realm.management/access_control.write.mx
--------------------------------------------------------------------------------
/TrySwiftData/Assets/en.lproj/TrySwiftDataLocalizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | TrySwiftData.strings
3 | Pods
4 |
5 | Created by Tim Oliver on 2/19/17.
6 |
7 | */
8 |
9 | "Platinum" = "Platinum";
10 | "Gold" = "Gold";
11 | "Silver" = "Silver";
12 | "Diversity" = "Diversity";
13 | "Student" = "Student";
14 | "Event" = "Event";
15 |
16 | "Sponsored Demo" = "Sponsored Demo";
17 | "🍴 Lunch" = "🍴 Lunch";
18 | "☕️ Break, by %@" = "☕️ Break, by %@";
19 | "☕️ Break" = "☕️ Break";
20 | "Office Hours with %@" = "Office Hours with %@";
21 | "Office Hours" = "Office Hours";
22 | "Presentation" = "Presentation";
23 | "⚡️🎤 Lightning Talk" = "⚡️🎤 Lightning Talk";
24 | "Demo" = "Demo";
25 | "Q&A" = "Q&A";
26 | "Conference" = "Conference";
27 | "Hackathon" = "Hackathon";
28 | "Party" = "Party";
29 |
--------------------------------------------------------------------------------
/TrySwiftData/Assets/ja.lproj/TrySwiftDataLocalizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | TrySwiftData.strings
3 | Pods
4 |
5 | Created by Tim Oliver on 2/19/17.
6 |
7 | */
8 |
9 | "Platinum" = "プラチナ";
10 | "Gold" = "ゴールド";
11 | "Silver" = "シルバー";
12 | "Diversity" = "ダイバーシティ";
13 | "Student" = "スカラシップ";
14 | "Event" = "サポーター";
15 |
16 | "Sponsored Demo" = "Sponsored Demo";
17 | "Coffee Break" = "休憩";
18 | "☕️ Break, by %@" = "☕️ Break, by %@";
19 | "☕️ Break" = "☕️ 休憩";
20 | "Lunch" = "ランチ";
21 | "🍴 Lunch" = "🍴 ランチ";
22 | "Office Hours with %@" = "スピーカーQ&A(%@)";
23 | "Office Hours" = "スピーカーQ&A";
24 | "Presentation" = "プレゼンテーション";
25 | "⚡️🎤 Lightning Talk" = "⚡️🎤 LT";
26 | "Demo" = "デモ";
27 | "Q&A" = "スピーカーQ&A";
28 | "Conference" = "カンファレンス";
29 | "Workshop" = "ワークショップ";
30 | "Hackathon" = "ハッカソン";
31 | "Party" = "パーティ";
32 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019ConferenceDays.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016ConferenceDays.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public let nyc2019ConferenceDays: [ConferenceDay] = [
10 | ConferenceDay(
11 | date: Date.date(year: 2019, month: 9, day: 8, hour: 14, minute: 0, second: 0),
12 | sessionBlocks: Array(nyc2019SessionBlocks[0..<1])
13 | ),
14 | ConferenceDay(
15 | date: Date.date(year: 2019, month: 9, day: 9, hour: 8, minute: 30, second: 0),
16 | sessionBlocks: Array(nyc2019SessionBlocks[1...19])
17 | ),
18 | ConferenceDay(
19 | date: Date.date(year: 2019, month: 9, day: 10, hour: 8, minute: 30, second: 0),
20 | sessionBlocks: Array(nyc2019SessionBlocks[20...38])
21 | )
22 | ]
23 |
24 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Conferences.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Conferences.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public let nyc2019Conferences: [Conference] = [
10 | Conference(
11 | name: "try! Conference",
12 | twitter: "tryswiftnyc",
13 | logoAssetName: "Logo_NYC.png",
14 | conferenceDescription: "try! Swift Conference is an international community gathering about the latest advancements in Swift Development. The event is about bringing together talent from all around the world to collaborate and share advanced knowledge and techniques to improve Swift craftsmanship. Coming again to New York City on September 9th & 10th 2019, with workshops on September 8th!",
15 | conferenceDescriptionJP: nil,
16 | email: "nyc@tryswift.co",
17 | slackURL: "https://tryswiftnyc.slack.com/",
18 | slackTeamID: "",
19 | venues: [nyc2019Venues["new-world-stages"]!,
20 | nyc2019Venues["frames-nyc"]!,
21 | nyc2019Venues["swiftui-workshop"]!,
22 | nyc2019Venues["combine-workshop"]!,
23 | nyc2019Venues["websocket-workshop"]!,
24 | nyc2019Venues["bosear-workshop"]!,
25 | nyc2019Venues["pi-workshop"]!,
26 | nyc2019Venues["fractal-workshop"]!,
27 | nyc2019Venues["communication-workshop"]!,
28 | nyc2019Venues["prototyping-workshop"]!,
29 | ],
30 | organizers: nyc2019Organizers,
31 | emojiSet: "🐥🎉🗽",
32 | timezone: "EST",
33 | dateFormat: "h:mm a"
34 | )
35 | ]
36 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Events.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Events.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public let nyc2019Events: [String : Event] = [:]
10 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Locations.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Locations.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public let nyc2019Locations: [String : Location] = [
10 | "qaroom" :
11 | Location(
12 | name: "Ask The Speaker"
13 | ),
14 | "hall" :
15 | Location(
16 | name: "Hall"
17 | ),
18 | "stage" :
19 | Location(
20 | name: "Stage 1"
21 | ),
22 | "stage2" :
23 | Location(
24 | name: "Stage 2"
25 | ),
26 | "workshop_location1" :
27 | Location(
28 | name: "TBA",
29 | nameJP: "TBA"
30 | ),
31 | "party" :
32 | Location(
33 | name: "Frames NYC",
34 | nameJP: "TBA"
35 | )
36 | ]
37 |
38 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Organizers.swift:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | import Foundation
6 |
7 | public let nyc2019Organizers: [Organizer] = [
8 | Organizer(
9 | id: 1,
10 | name: "Natasha Murashev",
11 | nameJP: nil,
12 | twitter: "NatashaTheRobot",
13 | imageAssetName: "natasha.jpg",
14 | bio: "Natasha is an iOS developer by day and a robot by night. She blogs about Swift, watchOS, and iOS development on her blog, NatashaTheRobot.com and organizes the try! Swift Conference around the world (including this one!). She's currently living the digital nomad life as her alter identity: @NatashaTheNomad.",
15 | bioJP: "昼間はiOSデベロッパ、夜はロボットです。NatashaTheRobot.comでSwiftやwatchOS、iOS開発に関するブログを書いています。急成長中の週刊Swiftニュースレター、This Week in Swiftや(今回を含めて)世界中で try! Swift カンファレンスを運営しています。現在は@NatashaTheNomadとしてデジタルノマド生活を送っています。",
16 | hidden: true
17 | ),
18 | Organizer(
19 | id: 1,
20 | name: "Daisy Ramos",
21 | nameJP: nil,
22 | twitter: "daisyr317",
23 | imageAssetName: "daisy.jpg",
24 | bio: "Daisy is an avid iOS developer and lover of all that is tech. Currently, she is a mobile developer at NBCUniversal working on exciting new features for the Telemundo Deportes En Vivo app. Before that she was on the iOS team at Citi FinTech building data-driven features for their consumer banking app. She also actively consults for early stage companies looking to build the next big thing, check out Blikkee on the App Store! Daisy holds a B.S in Computer Science from Queens College, the same college where the try! Swift NYC meetup originated. She now organizes the meetup with help from the amazing NYC iOS community to host a wide variety of technical Swift talks. She can be found on twitter as @daisyr317.",
25 | bioJP: nil,
26 | hidden: true
27 | ),
28 | Organizer(
29 | id: 1,
30 | name: "Nino Sakuma",
31 | nameJP: nil,
32 | twitter: "yucovin",
33 | imageAssetName: "yucovin.jpg",
34 | bio: "Nino Sakuma ( a. k. a. yucovin ) is a designer and a painter in Japan. She loves Apple products so much that she became an iOS developer. She is an instructor of iOS app development course for beginners `App Creator Dojo(App-Dojo)`. Web site: Apple Blog `Motto shiritai Ringo arekore`. Riko, the mascot of try! Swift, is designed by her.",
35 | bioJP: nil,
36 | hidden: true
37 | ),
38 | Organizer(
39 | id: 1,
40 | name: "Alvin Varghese",
41 | nameJP: nil,
42 | twitter: "speaktoalvin",
43 | imageAssetName: "alvin.jpg",
44 | bio: "Alvin Varghese is an iOS & macOS developer from the land of cultures and traditions, Kerala. He is in his early twenties, has extremely high energy levels and being idle kills him. He is really passionate about iOS Development and technology, that's why he chose to become a Swift lover and an iOS Developer. When he is not working on any projects, he engages himself by reading books and travelling. He has a life-long obsession with learning and exploring. Nowadays he spends lot of his time organizing and managing Swift India Developer Community .",
45 | bioJP: nil,
46 | hidden: true
47 | ),
48 | Organizer(
49 | id: 1,
50 | name: "Sara Ahmad",
51 | nameJP: nil,
52 | twitter: "saradev1114",
53 | imageAssetName: "saraAhmed.jpg",
54 | bio: "Sara is an iOS developer, who loves all things food, animals, fitness, technology, and humanitarian issues. She just finished up the iOS development program the Flatiron School and has a degree in nutrition and computer science. Originally aspired to go into medicine but decided against it and decided to change the world using technology by ultimately becoming a mobile developer. In her spare of time she can be found looking at various Ray Wenderlich tutorials or watching food recipe videos on youtube. Her dream is to change the world one app at a time. She is also one of the co-organizers for the Meetup group, try Swift! and is passionate about women in tech.",
55 | bioJP: nil,
56 | hidden: true
57 | )
58 | ]
59 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019SessionBlocks.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016SessionBlocks.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public let nyc2019SessionBlocks: [SessionBlock] = [
12 |
13 | // Day 0
14 |
15 | SessionBlock(
16 | startTime : Date.date(year: 2019, month: 9, day: 8, hour: 14, minute: 0, second: 0),
17 | endTime : Date.date(year: 2019, month: 9, day: 8, hour: 18, minute: 0, second: 0),
18 | sessions : [
19 | nyc2019Sessions["day0Workshop1"]!,
20 | nyc2019Sessions["day0Workshop2"]!,
21 | nyc2019Sessions["day0Workshop3"]!,
22 | nyc2019Sessions["day0Workshop4"]!,
23 | nyc2019Sessions["day0Workshop5"]!,
24 | nyc2019Sessions["day0Workshop6"]!,
25 | nyc2019Sessions["day0Workshop7"]!,
26 | nyc2019Sessions["day0Workshop8"]!
27 | ]
28 | ),
29 |
30 | // Day 1
31 |
32 | SessionBlock(
33 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 8, minute: 30, second: 0),
34 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 9, minute: 30, second: 0),
35 | sessions : [nyc2019Sessions["day1Breakfast"]!]
36 | ),
37 |
38 | SessionBlock(
39 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 9, minute: 30, second: 0),
40 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 9, minute: 45, second: 0),
41 | sessions : [nyc2019Sessions["day1Opening"]!]
42 | ),
43 |
44 | SessionBlock(
45 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 9, minute: 45, second: 0),
46 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 10, minute: 15, second: 0),
47 | sessions : [nyc2019Sessions["day1SwiftUI"]!]
48 | ),
49 |
50 | SessionBlock(
51 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 10, minute: 15, second: 0),
52 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 10, minute: 45, second: 0),
53 | sessions : [nyc2019Sessions["day1NaturalLanguage"]!,
54 | nyc2019Sessions["day1SwiftUIOfficeHours"]!]
55 | ),
56 |
57 | SessionBlock(
58 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 10, minute: 45, second: 0),
59 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 11, minute: 15, second: 0),
60 | sessions : [nyc2019Sessions["day1MobileReleases"]!,
61 | nyc2019Sessions["day1NaturalLanguageOfficeHours"]!]
62 | ),
63 |
64 | SessionBlock(
65 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 11, minute: 15, second: 0),
66 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 11, minute: 45, second: 0),
67 | sessions : [nyc2019Sessions["day1FirstCoffee"]!]
68 | ),
69 |
70 | SessionBlock(
71 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 11, minute: 45, second: 0),
72 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 12, minute: 15, second: 0),
73 | sessions : [nyc2019Sessions["day1SwiftLiteral"]!,
74 | nyc2019Sessions["day1MobileReleasesOfficeHours"]!]
75 | ),
76 |
77 | SessionBlock(
78 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 12, minute: 15, second: 0),
79 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 12, minute: 45, second: 0),
80 | sessions : [nyc2019Sessions["day1JaneAusten"]!,
81 | nyc2019Sessions["day1SwiftLiteralOfficeHours"]!]
82 | ),
83 |
84 | SessionBlock(
85 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 12, minute: 45, second: 0),
86 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 13, minute: 15, second: 0),
87 | sessions : [nyc2019Sessions["day1ServerSide"]!,
88 | nyc2019Sessions["day1JaneAustenOfficeHours"]!]
89 | ),
90 |
91 | SessionBlock(
92 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 13, minute: 15, second: 0),
93 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 14, minute: 20, second: 0),
94 | sessions : [nyc2019Sessions["day1Lunch"]!]
95 | ),
96 |
97 | SessionBlock(
98 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 14, minute: 20, second: 0),
99 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 14, minute: 50, second: 0),
100 | sessions : [nyc2019Sessions["day1Combine"]!,
101 | nyc2019Sessions["day1ServerSideOfficeHours"]!]
102 | ),
103 |
104 | SessionBlock(
105 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 14, minute: 50, second: 0),
106 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 15, minute: 20, second: 0),
107 | sessions : [nyc2019Sessions["day1iOSImage"]!,
108 | nyc2019Sessions["day1CombineOfficeHours"]!]
109 | ),
110 |
111 | SessionBlock(
112 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 15, minute: 20, second: 0),
113 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 15, minute: 50, second: 0),
114 | sessions : [nyc2019Sessions["day1Tensorflow"]!,
115 | nyc2019Sessions["day1iOSImageOfficeHours"]!]
116 | ),
117 |
118 | SessionBlock(
119 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 16, minute: 0, second: 0),
120 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 16, minute: 45, second: 0),
121 | sessions : [nyc2019Sessions["day1SecondCoffee"]!,
122 | nyc2019Sessions["day2AyurvedaOfficeHours"]!]
123 | ),
124 |
125 | SessionBlock(
126 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 16, minute: 45, second: 0),
127 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 17, minute: 15, second: 0),
128 | sessions : [nyc2019Sessions["day1ARkit"]!,
129 | nyc2019Sessions["day1TensorflowOfficeHours"]!]
130 | ),
131 |
132 | SessionBlock(
133 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 17, minute: 15, second: 0),
134 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 17, minute: 25, second: 0),
135 | sessions : [nyc2019Sessions["day1LT1"]!]
136 | ),
137 |
138 | SessionBlock(
139 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 17, minute: 25, second: 0),
140 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 17, minute: 55, second: 0),
141 | sessions : [nyc2019Sessions["day1ItsFine"]!,
142 | nyc2019Sessions["day1ARkitOfficeHours"]!]
143 | ),
144 |
145 | SessionBlock(
146 | startTime : Date.date(year: 2019, month: 9, day: 9, hour: 18, minute: 0, second: 0),
147 | endTime : Date.date(year: 2019, month: 9, day: 9, hour: 18, minute: 30, second: 0),
148 | sessions : [nyc2019Sessions["day1Closing"]!]
149 | ),
150 |
151 | SessionBlock(
152 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 18, minute: 30, second: 0),
153 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 20, minute: 30, second: 0),
154 | sessions : [nyc2019Sessions["day1Party"]!]
155 | ),
156 |
157 | // Day 2
158 |
159 | SessionBlock(
160 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 8, minute: 30, second: 0),
161 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 9, minute: 30, second: 0),
162 | sessions : [nyc2019Sessions["day2Breakfast"]!]
163 | ),
164 |
165 | SessionBlock(
166 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 9, minute: 30, second: 0),
167 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 9, minute: 45, second: 0),
168 | sessions : [nyc2019Sessions["day2Opening"]!]
169 | ),
170 |
171 | SessionBlock(
172 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 9, minute: 45, second: 0),
173 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 10, minute: 15, second: 0),
174 | sessions : [nyc2019Sessions["day2IOS13"]!,
175 | nyc2019Sessions["day2ItsFineOfficeHours"]!]
176 | ),
177 |
178 | SessionBlock(
179 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 10, minute: 15, second: 0),
180 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 10, minute: 25, second: 0),
181 | sessions : [nyc2019Sessions["day2LT2"]!]
182 | ),
183 |
184 | SessionBlock(
185 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 10, minute: 25, second: 0),
186 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 10, minute: 55, second: 0),
187 | sessions : [nyc2019Sessions["day2Encoding"]!,
188 | nyc2019Sessions["day2IOS13OfficeHours"]!]
189 | ),
190 |
191 | SessionBlock(
192 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 11, minute: 0, second: 0),
193 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 11, minute: 30, second: 0),
194 | sessions : [nyc2019Sessions["day2FirstCoffee"]!]
195 | ),
196 |
197 | SessionBlock(
198 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 11, minute: 30, second: 0),
199 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 11, minute: 55, second: 0),
200 | sessions : [nyc2019Sessions["day2SwiftUI25"]!,
201 | nyc2019Sessions["day2EncodingOfficeHours"]!]
202 | ),
203 |
204 | SessionBlock(
205 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 12, minute: 0, second: 0),
206 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 12, minute: 30, second: 0),
207 | sessions : [nyc2019Sessions["day2Subscriptions"]!,
208 | nyc2019Sessions["day2SwiftUI25OfficeHours"]!]
209 | ),
210 |
211 | SessionBlock(
212 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 12, minute: 30, second: 0),
213 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 12, minute: 55, second: 0),
214 | sessions : [nyc2019Sessions["day2CPlusPlus"]!,
215 | nyc2019Sessions["day2SubscriptionsOfficeHours"]!]
216 | ),
217 |
218 | SessionBlock(
219 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 13, minute: 0, second: 0),
220 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 14, minute: 20, second: 0),
221 | sessions : [nyc2019Sessions["day2Lunch"]!]
222 | ),
223 |
224 | SessionBlock(
225 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 14, minute: 20, second: 0),
226 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 14, minute: 50, second: 0),
227 | sessions : [nyc2019Sessions["day2UIColor"]!,
228 | nyc2019Sessions["day2CPlusPlusOfficeHours"]!]
229 | ),
230 |
231 | SessionBlock(
232 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 14, minute: 50, second: 0),
233 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 15, minute: 0, second: 0),
234 | sessions : [nyc2019Sessions["day2LT3"]!]
235 | ),
236 |
237 | SessionBlock(
238 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 15, minute: 0, second: 0),
239 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 15, minute: 30, second: 0),
240 | sessions : [nyc2019Sessions["day2APIs"]!,
241 | nyc2019Sessions["day2UIColorOfficeHours"]!]
242 | ),
243 |
244 | SessionBlock(
245 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 15, minute: 30, second: 0),
246 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 16, minute: 0, second: 0),
247 | sessions : [nyc2019Sessions["day2AsyncHTTPClient"]!,
248 | nyc2019Sessions["day2APIsOfficeHours"]!]
249 | ),
250 |
251 | SessionBlock(
252 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 16, minute: 0, second: 0),
253 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 16, minute: 30, second: 0),
254 | sessions : [nyc2019Sessions["day2SecondCoffee"]!,
255 | nyc2019Sessions["day2AyurvedaOfficeHours"]!]
256 | ),
257 |
258 | SessionBlock(
259 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 16, minute: 30, second: 0),
260 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 17, minute: 0, second: 0),
261 | sessions : [nyc2019Sessions["day2NoScreens"]!,
262 | nyc2019Sessions["day2AsyncHTTPClientOfficeHours"]!]
263 | ),
264 |
265 | SessionBlock(
266 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 17, minute: 0, second: 0),
267 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 17, minute: 30, second: 0),
268 | sessions : [nyc2019Sessions["day2Bitcoin"]!,
269 | nyc2019Sessions["day2NoScreensOfficeHours"]!]
270 | ),
271 |
272 | SessionBlock(
273 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 17, minute: 30, second: 0),
274 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 18, minute: 0, second: 0),
275 | sessions : [nyc2019Sessions["day2Ayurveda"]!,
276 | nyc2019Sessions["day2BitcoinOfficeHours"]!]
277 | ),
278 |
279 | SessionBlock(
280 | startTime : Date.date(year: 2019, month: 9, day: 10, hour: 18, minute: 0, second: 0),
281 | endTime : Date.date(year: 2019, month: 9, day: 10, hour: 18, minute: 30, second: 0),
282 | sessions : [nyc2019Sessions["day2Closing"]!]
283 | ),
284 | ]
285 |
286 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Sessions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Sessions.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public let nyc2019Sessions: [String : Session] = [
12 | //---------------------------------------------------------
13 |
14 | // Day 0 Workshops
15 | "day0Workshop1" : Session(
16 | type : .workshop,
17 | title : "SwiftUI Hands-on",
18 | imageAssetName : "paul.jpg",
19 | presentation : nyc2019Presentations["swiftui"],
20 | venue : nyc2019Venues["swiftui-workshop"]
21 | ),
22 | "day0Workshop2" : Session(
23 | type : .workshop,
24 | title : "Super Easy Combine - This is an Awesome App Workshop",
25 | imageAssetName : "pauls.jpg",
26 | presentation : nyc2019Presentations["combinewrkshp"],
27 | venue : nyc2019Venues["combine-workshop"]
28 | ),
29 | "day0Workshop3" : Session(
30 | type : .workshop,
31 | title : "Build a cloud-ready WebSocket server in Swift",
32 | imageAssetName : "sanjian.png",
33 | presentation : nyc2019Presentations["websocket"],
34 | venue : nyc2019Venues["websocket-workshop"]
35 | ),
36 | "day0Workshop4" : Session(
37 | type : .workshop,
38 | title : "Bose AR SDK for Native iOS",
39 | imageAssetName : "bosearsquare.png",
40 | presentation : nyc2019Presentations["bosear"],
41 | venue : nyc2019Venues["bosear-workshop"]
42 | ),
43 | "day0Workshop5" : Session(
44 | type : .workshop,
45 | title : "Swift on the Raspberry PI - Building A Circuit to Control an LED",
46 | imageAssetName : "marc.jpg",
47 | presentation : nyc2019Presentations["raspberrypi"],
48 | venue : nyc2019Venues["pi-workshop"]
49 | ),
50 | "day0Workshop6" : Session(
51 | type : .workshop,
52 | title : "Fractal: Atomic Design Theory with Declarative UI (think SwiftUI for Today)",
53 | imageAssetName : "jonbott.jpg",
54 | presentation : nyc2019Presentations["fractal"],
55 | venue : nyc2019Venues["fractal-workshop"]
56 | ),
57 | "day0Workshop7" : Session(
58 | type : .workshop,
59 | title : "Technology Experience Prototyping",
60 | imageAssetName : "carson_mark.jpg",
61 | presentation : nyc2019Presentations["prototyping"],
62 | venue : nyc2019Venues["prototyping-workshop"]
63 | ),
64 | "day0Workshop8" : Session(
65 | type : .workshop,
66 | title : "Professional Communication Skill-Building",
67 | imageAssetName : "chris.jpg",
68 | presentation : nyc2019Presentations["communication"],
69 | venue : nyc2019Venues["communication-workshop"]
70 | ),
71 |
72 | // Day 1 Sessions
73 | "day1Breakfast" : Session(
74 | type: .breakfast,
75 | title: "Registration & Breakfast",
76 | imageAssetName: "donuts2.png",
77 | location: nyc2019Locations["hall"]
78 | ),
79 | //---------------------------------------------------------
80 | "day1Opening" : Session(
81 | type: .announcement,
82 | title: "Opening Remarks",
83 | imageAssetName: "announce_nyc_2.png",
84 | location: nyc2019Locations["hall"]
85 | ),
86 | //---------------------------------------------------------
87 | "day1SwiftUI" : Session(
88 | type: .talk,
89 | presentation: nyc2019Presentations["swiftui-production"],
90 | location: nyc2019Locations["stage"]
91 | ),
92 | "day1SwiftUIOfficeHours" : Session(
93 | type: .officeHours,
94 | presentation: nyc2019Presentations["swiftui-production"],
95 | location: nyc2019Locations["qaroom"]
96 | ),
97 | //---------------------------------------------------------
98 | "day1NaturalLanguage" : Session(
99 | type: .talk,
100 | presentation: nyc2019Presentations["natural-languages"],
101 | location: nyc2019Locations["stage"]
102 | ),
103 | "day1NaturalLanguageOfficeHours" : Session(
104 | type: .officeHours,
105 | presentation: nyc2019Presentations["natural-languages"],
106 | location: nyc2019Locations["qaroom"]
107 | ),
108 | //---------------------------------------------------------
109 | "day1MobileReleases" : Session(
110 | type: .talk,
111 | presentation: nyc2019Presentations["mobile-releases"],
112 | location: nyc2019Locations["stage"]
113 | ),
114 | "day1MobileReleasesOfficeHours" : Session(
115 | type : .officeHours,
116 | presentation : nyc2019Presentations["mobile-releases"],
117 | location : nyc2019Locations["qaroom"]
118 | ),
119 | //---------------------------------------------------------
120 | "day1FirstCoffee" : Session(
121 | type : .coffeeBreak,
122 | imageAssetName : "breaktime1.png",
123 | location : nyc2019Locations["hall"]
124 | ),
125 | //---------------------------------------------------------
126 | "day1SwiftLiteral" : Session(
127 | type : .talk,
128 | presentation : nyc2019Presentations["swift-literal"],
129 | location : nyc2019Locations["stage"]
130 | ),
131 | "day1SwiftLiteralOfficeHours" : Session(
132 | type : .officeHours,
133 | presentation : nyc2019Presentations["swift-literal"],
134 | location : nyc2019Locations["qaroom"]
135 | ),
136 | //---------------------------------------------------------
137 | "day1JaneAusten" : Session(
138 | type : .talk,
139 | presentation : nyc2019Presentations["jane-austen"],
140 | location : nyc2019Locations["stage"]
141 | ),
142 | "day1JaneAustenOfficeHours" : Session(
143 | type : .officeHours,
144 | presentation : nyc2019Presentations["jane-austen"],
145 | location : nyc2019Locations["qaroom"]
146 | ),
147 | //---------------------------------------------------------
148 | "day1ServerSide" : Session(
149 | type : .talk,
150 | presentation : nyc2019Presentations["server-side"],
151 | location : nyc2019Locations["stage"]
152 | ),
153 | "day1ServerSideOfficeHours" : Session(
154 | type : .officeHours,
155 | presentation : nyc2019Presentations["server-side"],
156 | location : nyc2019Locations["qaroom"]
157 | ),
158 | //---------------------------------------------------------
159 | "day1Lunch" : Session(
160 | type : .lunch,
161 | imageAssetName : "lunch2.png",
162 | location : nyc2019Locations["hall"]
163 | ),
164 | //---------------------------------------------------------
165 | "day1Combine" : Session(
166 | type : .talk,
167 | presentation : nyc2019Presentations["combine"],
168 | location : nyc2019Locations["stage"]
169 | ),
170 | "day1CombineOfficeHours" : Session(
171 | type : .officeHours,
172 | presentation : nyc2019Presentations["combine"],
173 | location : nyc2019Locations["qaroom"]
174 | ),
175 | //---------------------------------------------------------
176 | "day1iOSImage" : Session(
177 | type : .talk,
178 | presentation : nyc2019Presentations["ios-image"],
179 | location : nyc2019Locations["stage"]
180 | ),
181 | "day1iOSImageOfficeHours" : Session(
182 | type : .officeHours,
183 | presentation : nyc2019Presentations["ios-image"],
184 | location : nyc2019Locations["qaroom"]
185 | ),
186 | //---------------------------------------------------------
187 | "day1Tensorflow" : Session(
188 | type : .talk,
189 | presentation : nyc2019Presentations["tensorflow"],
190 | location : nyc2019Locations["stage"]
191 | ),
192 | "day1TensorflowOfficeHours" : Session(
193 | type : .officeHours,
194 | presentation : nyc2019Presentations["tensorflow"],
195 | location : nyc2019Locations["qaroom"]
196 | ),
197 | //---------------------------------------------------------
198 | "day1SecondCoffee" : Session(
199 | type : .coffeeBreak,
200 | imageAssetName : "breaktime2.png",
201 | location : nyc2019Locations["hall"]
202 | ),
203 | //---------------------------------------------------------
204 | "day1ARkit" : Session(
205 | type : .talk,
206 | presentation : nyc2019Presentations["arkit-coreml"],
207 | location : nyc2019Locations["stage2"]
208 | ),
209 | "day1ARkitOfficeHours" : Session(
210 | type : .officeHours,
211 | presentation : nyc2019Presentations["arkit-coreml"],
212 | location : nyc2019Locations["qaroom"]
213 | ),
214 | //---------------------------------------------------------
215 | "day1LT1" : Session(
216 | type: .lightningTalk,
217 | presentation: nyc2019Presentations["lt1"],
218 | location: nyc2019Locations["stage2"]
219 | ),
220 | //---------------------------------------------------------
221 | "day1ItsFine" : Session(
222 | type : .talk,
223 | presentation : nyc2019Presentations["its-fine"],
224 | location : nyc2019Locations["stage2"]
225 | ),
226 | "day2ItsFineOfficeHours" : Session(
227 | type : .officeHours,
228 | presentation : nyc2019Presentations["its-fine"],
229 | location : nyc2019Locations["qaroom"]
230 | ),
231 | //---------------------------------------------------------
232 | "day1Closing" : Session(
233 | type : .announcement,
234 | title : "Closing / Announcments",
235 | imageAssetName : "announce_nyc_1.png",
236 | location : nyc2019Locations["stage2"]
237 | ),
238 |
239 | //---------------------------------------------------------
240 | "day1Party" : Session(
241 | type : .party,
242 | title : "🎳 Party",
243 | imageAssetName : "frames.jpg",
244 | location : nyc2019Locations["party"],
245 | venue: nyc2019Venues["frames-nyc"] //TODO
246 | ),
247 |
248 | //---------------------------------------------------------
249 | // Day 2 Sessions
250 | "day2Breakfast" : Session(
251 | type : .breakfast,
252 | title : "Breakfast",
253 | imageAssetName : "donuts1.png",
254 | location : nyc2019Locations["hall"]
255 | ),
256 | //---------------------------------------------------------
257 | "day2Opening" : Session(
258 | type : .announcement,
259 | title : "Opening Remarks",
260 | imageAssetName : "announce_nyc_1.png",
261 | location : nyc2019Locations["stage"]
262 | ),
263 | //---------------------------------------------------------
264 | "day2IOS13" : Session(
265 | type : .talk,
266 | presentation : nyc2019Presentations["ios13"],
267 | location : nyc2019Locations["stage"]
268 | ),
269 | "day2IOS13OfficeHours" : Session(
270 | type : .officeHours,
271 | presentation : nyc2019Presentations["ios13"],
272 | location : nyc2019Locations["qaroom"]
273 | ),
274 | //---------------------------------------------------------
275 | "day2LT2" : Session(
276 | type: .lightningTalk,
277 | presentation: nyc2019Presentations["lt2"],
278 | location: nyc2019Locations["stage"]
279 | ),
280 | //---------------------------------------------------------
281 | "day2Encoding" : Session(
282 | type : .talk,
283 | presentation : nyc2019Presentations["encoding-decoding"],
284 | location : nyc2019Locations["stage"]
285 | ),
286 | "day2EncodingOfficeHours" : Session(
287 | type : .officeHours,
288 | presentation : nyc2019Presentations["encoding-decoding"],
289 | location : nyc2019Locations["qaroom"]
290 | ),
291 | //---------------------------------------------------------
292 | "day2FirstCoffee" : Session(
293 | type : .coffeeBreak,
294 | imageAssetName : "breaktime1.png",
295 | location : nyc2019Locations["hall"]
296 | ),
297 | //---------------------------------------------------------
298 | "day2SwiftUI25" : Session(
299 | type : .talk,
300 | presentation : nyc2019Presentations["swiftui25"],
301 | location : nyc2019Locations["stage"]
302 | ),
303 | "day2SwiftUI25OfficeHours" : Session(
304 | type : .officeHours,
305 | presentation : nyc2019Presentations["swiftui25"],
306 | location : nyc2019Locations["qaroom"]
307 | ),
308 | //---------------------------------------------------------
309 | "day2Subscriptions" : Session(
310 | type : .talk,
311 | presentation : nyc2019Presentations["app-subscriptions"],
312 | location : nyc2019Locations["stage"]
313 | ),
314 | "day2SubscriptionsOfficeHours" : Session(
315 | type : .officeHours,
316 | presentation : nyc2019Presentations["app-subscriptions"],
317 | location : nyc2019Locations["qaroom"]
318 | ),
319 | //---------------------------------------------------------
320 | "day2CPlusPlus" : Session(
321 | type : .talk,
322 | presentation : nyc2019Presentations["cplusplus"],
323 | location : nyc2019Locations["stage"]
324 | ),
325 | "day2CPlusPlusOfficeHours" : Session(
326 | type : .officeHours,
327 | presentation : nyc2019Presentations["cplusplus"],
328 | location : nyc2019Locations["qaroom"]
329 | ),
330 | //---------------------------------------------------------
331 | "day2Lunch" : Session(
332 | type : .lunch,
333 | imageAssetName : "lunch3.png",
334 | location : nyc2019Locations["hall"]
335 | ),
336 | //---------------------------------------------------------
337 | "day2UIColor" : Session(
338 | type : .talk,
339 | presentation : nyc2019Presentations["uicolor"],
340 | location : nyc2019Locations["stage"]
341 | ),
342 | "day2UIColorOfficeHours" : Session(
343 | type : .officeHours,
344 | presentation : nyc2019Presentations["uicolor"],
345 | location : nyc2019Locations["qaroom"]
346 | ),
347 | //---------------------------------------------------------
348 | "day2LT3" : Session(
349 | type: .lightningTalk,
350 | presentation: nyc2019Presentations["lt3"],
351 | location: nyc2019Locations["stage"]
352 | ),
353 | //---------------------------------------------------------
354 | "day2APIs" : Session(
355 | type : .talk,
356 | presentation : nyc2019Presentations["apis"],
357 | location : nyc2019Locations["stage"]
358 | ),
359 | "day2APIsOfficeHours" : Session(
360 | type : .officeHours,
361 | presentation : nyc2019Presentations["apis"],
362 | location : nyc2019Locations["qaroom"]
363 | ),
364 | //---------------------------------------------------------
365 | "day2AsyncHTTPClient" : Session(
366 | type : .talk,
367 | presentation : nyc2019Presentations["AsyncHTTPClient"],
368 | location : nyc2019Locations["stage"]
369 | ),
370 | "day2AsyncHTTPClientOfficeHours" : Session(
371 | type : .officeHours,
372 | presentation : nyc2019Presentations["AsyncHTTPClient"],
373 | location : nyc2019Locations["qaroom"]
374 | ),
375 | //---------------------------------------------------------
376 | "day2SecondCoffee" : Session(
377 | type : .coffeeBreak,
378 | imageAssetName : "breaktime2.png",
379 | location : nyc2019Locations["hall"]
380 | ),
381 | //---------------------------------------------------------
382 | "day2NoScreens" : Session(
383 | type : .talk,
384 | presentation : nyc2019Presentations["no-screens"],
385 | location : nyc2019Locations["stage"]
386 | ),
387 | "day2NoScreensOfficeHours" : Session(
388 | type : .officeHours,
389 | presentation : nyc2019Presentations["no-screens"],
390 | location : nyc2019Locations["qaroom"]
391 | ),
392 | //---------------------------------------------------------
393 | "day2Bitcoin" : Session(
394 | type : .talk,
395 | presentation : nyc2019Presentations["bitcoin-cash"],
396 | location : nyc2019Locations["stage"]
397 | ),
398 | "day2BitcoinOfficeHours" : Session(
399 | type : .officeHours,
400 | presentation : nyc2019Presentations["bitcoin-cash"],
401 | location : nyc2019Locations["qaroom"]
402 | ),
403 | //---------------------------------------------------------
404 | "day2Ayurveda" : Session(
405 | type : .talk,
406 | presentation : nyc2019Presentations["ayurveda"],
407 | location : nyc2019Locations["stage"]
408 | ),
409 | "day2AyurvedaOfficeHours" : Session(
410 | type : .officeHours,
411 | presentation : nyc2019Presentations["ayurveda"],
412 | location : nyc2019Locations["qaroom"]
413 | ),
414 | //---------------------------------------------------------
415 | "day2Closing" : Session(
416 | type : .announcement,
417 | title : " Closing / Announcements",
418 | imageAssetName : "announce_nyc_2.png",
419 | location : nyc2019Locations["stage"]
420 | ),
421 |
422 | ]
423 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Speakers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Speakers.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public let nyc2019Speakers: [String : Speaker] = [
12 |
13 | "paulh" : Speaker(
14 | id: 1,
15 | name: "Paul Hudson",
16 | twitter: "twostraws",
17 | imageAssetName: "paul.jpg",
18 | bio: "Paul is the author of Hacking with Swift, Pro Swift, Swift Design Patterns, Testing Swift, Server-Side Swift, Hacking with watchOS, Swift Coding Challenges, and more. Suffice it to say, he quite likes Swift. And coffee. (But mostly Swift.) (And coffee.)"
19 | ),
20 | "kelly" : Speaker(
21 | id: 2,
22 | name: "Kelly Hutchison",
23 | twitter: "kelhutch17",
24 | imageAssetName: "kelly.jpg",
25 | bio: "Kelly is an iOS engineer at Reddit, building out moderator tools in the mobile app. When she is not coding, you can find her playing Pokémon GO, browsing Reddit, or petting her two cats."
26 | ),
27 | "jordan" : Speaker(
28 | id: 3,
29 | name: "Jordan Morgan",
30 | twitter: "JordanMorgan10",
31 | imageAssetName: "jordan.jpg",
32 | bio: "Jordan is an iOS engineer from Ozark, Missouri where he lives with his wife and three kids. Currently, he works remotely at Buffer on the iOS team building a suite of social media tools. In addition, is the author of swiftjectivec.com where he writes about technical topics on iOS development and life as an indie developer"
33 | ),
34 | "eli" : Speaker(
35 | id: 4,
36 | name: "Eli Budelli",
37 | twitter: "elibud",
38 | imageAssetName: "eli.jpg",
39 | bio: "Eli Budelli has spent most of her professional career developing mobile apps, from the Palm Pilot to the iPhone X. She has worked as a developer and release manager for the WordPress iOS app. In her current role as Head of Mobile at Automattic she leads a 45 people team distributed across 18 countries."
40 | ),
41 | "dabby" : Speaker(
42 | id: 5,
43 | name: "Dabby Ndubisi",
44 | twitter: "DabbyNdubisi",
45 | imageAssetName: "dabby.jpg",
46 | bio: "Dabby is an iOS engineer at Shopify, where he is currently working on the Checkout functionality for the Shopify POS app. In his spare time, he is either blogging on his website (yourfriendlyioscoder.com), learning new languages, or trying to understand what his dog is thinking."
47 | ),
48 | "yuki" : Speaker(
49 | id: 6,
50 | name: "Yuki Aki",
51 | twitter: "___freddi___",
52 | imageAssetName: "yuki.jpg",
53 | bio: "Yuki is an iOS engineer at LINE Fukuoka. He tries to understand Swift's language specifications better every day to improve his code. He likes to draw cat illustration on his iPad, which he uses to expresses his feelings in everyday life."
54 | ),
55 | "kaitlin" : Speaker(
56 | id: 7,
57 | name: "Kaitlin Mahar",
58 | twitter: "k__mahar",
59 | imageAssetName: "kaitlin.jpg",
60 | bio: "Kaitlin is a software engineer living in NYC. She works at MongoDB, where she leads development of the official MongoDB driver for Swift. Outside of work she enjoys doing crossword puzzles, playing with her cats, and trying all of the amazing food and drinks NYC has to offer."
61 | ),
62 | "paige" : Speaker(
63 | id: 8,
64 | name: "Paige Bailey",
65 | twitter: "DynamicWebPaige",
66 | imageAssetName: "paige.jpg",
67 | bio: "Paige Bailey is the product manager for Swift for TensorFlow and TensorFlow's core Python APIs. Prior to her role as a PM in Google's Research and Machine Intelligence org, Paige was developer advocate for TensorFlow core; a senior software engineer and machine learning engineer in the office of the Microsoft Azure CTO; and a data scientist at Chevron. Her academic research was focused on lunar ultraviolet, at the Laboratory for Atmospheric and Space Physics (LASP) in Boulder, CO, as well as Southwest Research Institute (SwRI) in San Antonio, TX."
68 | ),
69 | "anne" : Speaker(
70 | id: 9,
71 | name: "Anne Cahalan",
72 | twitter: "northofnormal",
73 | imageAssetName: "anne.jpg",
74 | bio: "Anne is an iOS developer at Detroit Labs, where she is constantly delighted by the niftiness of Swift. Passionate about clean code, craft cocktails, and nice yarn, she dreams of an elegantly-designed app that pairs cocktails with knitting patterns. She is contractually required to mention her three-legged cat, Wobbles."
75 | ),
76 | "lea" : Speaker(
77 | id: 10,
78 | name: "Lea Marolt",
79 | twitter: "hellosunschein",
80 | imageAssetName: "lea.jpg",
81 | bio: "Lea spent three years in New York, working on the iOS application for Rent the Runway and teaching Swift at General Assembly. Now, she's getting a masters in Innovation Design Engineering in London, and spends most of her time playing with sensors and microcontrollers. She still Swifts, though, by writing tutorials and creating video courses for raywenderlich.com."
82 | ),
83 | "ish" : Speaker(
84 | id: 11,
85 | name: "Ishmael Shabazz",
86 | twitter: "ishabazz",
87 | imageAssetName: "ish.jpg",
88 | bio: "Ish is an independent app developer from Southern California. He’s been developing iOS apps since 2010 and was featured in the 2017 documentary 'App: The Human Story'. He is the founder of Illuminated Bits and has published several iOS apps including Capsicum, a new daily-planner for iOS inspired by beautiful paper-based planners. Ish has been fortunate enough to have his work featured by Apple, Starbucks, The Verge, TechCrunch, Daring Fireball, iMore, 9to5Mac, iDownloadBlog, CNET and many more. He hosts a meetup once a month in Rancho Cucamonga, CA and loves to support and mentor those interested in software development."
89 | ),
90 | "jean" : Speaker(
91 | id: 12,
92 | name: "Jean-Baptiste Dominguez",
93 | twitter: "jbdtky",
94 | imageAssetName: "jean.jpg",
95 | bio: "Swift lover, JB fell in love with Swift when he got his first MacBook in 2016. Currently he works at Bitcoin.com as engineering lead where he develops with his team SDK and Apps on top of Bitcoin Cash. Living in Tokyo, he likes riding on his hover board listening Taylor Swift and eating good foods."
96 | ),
97 | "laura" : Speaker(
98 | id: 13,
99 | name: "Laura Savino",
100 | twitter: "savinola",
101 | imageAssetName: "laura.jpg",
102 | bio: "Laura is an iOS developer who’s used Swift since the early betas (at Khan Academy), and now contributes in C++ and Objective C to Photoshop for iPad at Adobe. She’s a frequent conference speaker and mother to a toddler, and has ordered coffee in ten different languages."
103 | ),
104 | "dave" : Speaker(
105 | id: 14,
106 | name: "Dave Verwer",
107 | twitter: "daveverwer",
108 | imageAssetName: "dave.jpg",
109 | bio: "Dave is a independent and freelance iOS developer and author of iOS Dev Weekly. He has been developing for the Mac and iOS since 2006 and is secretly quite proud that his first professional gig had him using a (real) vt100 green screen terminal. He's glad he doesn't have to use that any more though! If you'd like to learn more about Dave, visit daveverwer.com."
110 | ),
111 | "soojin" : Speaker(
112 | id: 15,
113 | name: "Soojin Ro",
114 | twitter: "soojinro",
115 | imageAssetName: "soojinro.jpg",
116 | bio: "Soojin is an iOS developer based in South Korea, making the comics app WEBTOON for 55M+ global users. He is passionate about Swift and ARKit, and believes everyone will have their own AR glasses one day. Once a business major in university, he started coding in spare time and the first iOS app he crafted was awarded the Best of 2015, 2016, and 2017 (Yes, three years in a row!) Top Paid Apps in South Korea. He writes about Swift, programming, and mobile apps on soojin.ro."
117 | ),
118 | "shai" : Speaker(
119 | id: 16,
120 | name: "Shai Mishali",
121 | twitter: "freak4pc",
122 | imageAssetName: "shai.jpg",
123 | bio: "Shai is iOS Tech Lead for Gett, the on-demand mobility company, and is involved in several open source projects on his spare time - mainly the RxSwiftCommunity and RxSwift projects, as well as an international speaker. Author on the upcoming Combine book from raywenderlich.com and a hackathon addict and 1st place winner of BattleHack World Finals 2014. You can find him on GitHub and Twitter as @freak4pc."
124 | ),
125 | "marc" : Speaker(
126 | id: 17,
127 | name: "Marc Aupont",
128 | twitter: "digimarktech",
129 | imageAssetName: "marc.jpg",
130 | bio: "Marc Aupont is a first-generation American born from Haitian immigrant parents. His passion for technology led him to move from Orlando, FL to NYC 2 years ago. He currently works at Lickability as an iOS Engineer and his hobbies include: working on side projects involving electronics and hardware, hosting and organizing tech meetups, as well as weekend road trips to random destinations with his wife and two boys."
131 | ),
132 | "tom" : Speaker(
133 | id: 18,
134 | name: "Tom Doron",
135 | twitter: "tomerdoron",
136 | imageAssetName: "tom_doron.jpg",
137 | bio: "Tom works at Apple where he is serving as a senior engineering manager focusing on core cloud technologies and open source libraries and frameworks."
138 | ),
139 | "chris" : Speaker(
140 | id: 19,
141 | name: "Chris Britt",
142 | twitter: "chrisbritt",
143 | imageAssetName: "chris.jpg",
144 | bio: "Chris Britt is a speaker, emcee and magical thinker. He has spent ten years working in tech marketing at Dell and EMC Corp, and helped kickstart the funding of Hypothes.is, an open source project that allows annotation of the web, with anyone, anywhere. As a magician he has invented over 50 illusions and is happy to be back in NYC.",
145 | type: .emcee
146 | ),
147 | "amy" : Speaker(
148 | id: 20,
149 | name: "Jaspellior",
150 | twitter: "jaspellior",
151 | imageAssetName: "amy.jpg",
152 | bio: "Jaspellior is a Twitch Affiliate variety game streamer. She has loved all kinds of games her entire life, having started in video games during the PS1 era. Formerly a Swift developer, she’s attended try! Swift NYC all three years prior and is thrilled to be back now as an emcee. Find her on twitch.tv/jaspellior during weekday afternoons!",
153 | type: .emcee
154 | ),
155 | "hector" : Speaker(
156 | id: 21,
157 | name: "Hector Matos",
158 | twitter: "krakendev",
159 | imageAssetName: "hector.jpg",
160 | bio: "Hector is the Lead Mobile Design Technologist at DoorDash, where he's working on reusable mobile components and infrastructure for their internal design system. He's a huge fan of the Legend of Zelda (and video games in general). He's a Twitch streamer (check him out at twitch.tv/krakendev) where he plays lots of Overwatch and occasionally teaches others how to code live. He also runs the krakendev.io Swift programming blog and speaks around the world at several Swift conferences, including try! Swift, too!",
161 | type: .emcee
162 | ),
163 | "pauls" : Speaker(
164 | id: 22,
165 | name: "Paul Solt",
166 | twitter: "PaulSolt",
167 | imageAssetName: "pauls.jpg",
168 | bio: "Paul is an iOS Instructor at Lambda School living in Rochester, NY. Previously he worked at both Apple and Microsoft. When he's not working on iOS apps he loves pour-over coffee, running, gardening, and ultimate frisbee.",
169 | type: .instructor
170 | ),
171 | "ian" : Speaker(
172 | id: 23,
173 | name: "Ian Partridge",
174 | twitter: "alfa",
175 | imageAssetName: "ian.jpg",
176 | bio: "Ian Partridge is the technical lead of the Swift@IBM development team, working in open source to bring Swift to the cloud. A committer to the core Swift libraries and a developer of Kitura, one of the leading Swift web frameworks, he comes from a background in virtual machine performance and debugging. Ian regularly speaks at conferences including AltConf, iOSCon, dotSwift, SwiftConf and more.",
177 | type: .instructor
178 | ),
179 | "sanjeev" : Speaker(
180 | id: 24,
181 | name: "Sanjeev Ghimire",
182 | twitter: "sanjeevghimire",
183 | imageAssetName: "sanjeev.jpg",
184 | bio: "Sanjeev is a Developer Advocate at IBM Digital Business Group. He mostly focuses on creating code patterns for developers based on AI Data and Analytics using IBM Cloud and Watson services. He is also an open source contributor and highly promotes open source projects.",
185 | type: .instructor
186 | ),
187 | "jon" : Speaker(
188 | id: 26,
189 | name: "Jon Bott",
190 | twitter: "Herbal7ea",
191 | imageAssetName: "jonbott.jpg",
192 | bio: "By day, Jon is a Senior Mobile Developer at Mercari in Tokyo, Japan, and a LinkedIn author. By night he is a Photographer (@Herbal7ea) and aspiring YouTuber. With over 10 years of mobile, and ~20 in backend experience, he is passionate about teaching and making development simple, fast and stable.",
193 | type: .instructor
194 | ),
195 | "carson" : Speaker(
196 | id: 27,
197 | name: "Carson Ramsden",
198 | twitter: "carson_ramsden",
199 | imageAssetName: "carson.jpg",
200 | bio: "Carson is a iOS engineer at One Medical, where she finds herself doing everything from app development to building Ruby GraphQL APIs. She is passionate about architecture and design and finds that she can accomplish this best with a complete understanding of the system; backend and frontend. When she is not coding, Carson tries to spend as much time as possible outdoors - enjoying beautiful California!",
201 | type: .instructor
202 | ),
203 | "mark" : Speaker(
204 | id: 28,
205 | name: "Mark Stuenkel",
206 | twitter: "mstuenkel",
207 | imageAssetName: "mas.png",
208 | bio: "Mark is a senior product designer at One Medical and focuses on creating experiences for doctors and patients. He's also a board member for Inneract Project, a nonprofit that teaches design to underserved youth in the Bay Area. Talk to him about prototyping, design systems, and collaboration.",
209 | type: .instructor
210 | ),
211 | "chris_workshop" : Speaker(
212 | id: 29,
213 | name: "Chris Britt",
214 | twitter: "chrisbritt",
215 | imageAssetName: "chris-workshop.jpg",
216 | bio: "Chris Britt has led communication skill-building workshops at Kellogg School of Management, Babson College, Dell Technologies, and at smaller organizations nationwide. In addition to graduating from Northwestern University’s School of Communications with a focus on leadership and communication styles, Chris attended the Second City Conservatory of improv comedy. He likes to bring fun into learning environments through interactive exercises, games and a touch of magic.",
217 | hidden: true,
218 | type: .instructor
219 | ),
220 | "sanjian" : Speaker(
221 | id: 30,
222 | name: "Ian & Sanjeev",
223 | twitter: "KituraSwift",
224 | imageAssetName: "sanjian.png",
225 | bio: "Ian Partridge is the technical lead of the Swift@IBM development team, working in open source to bring Swift to the cloud. A committer to the core Swift libraries and a developer of Kitura, one of the leading Swift web frameworks, he comes from a background in virtual machine performance and debugging. Ian regularly speaks at conferences including AltConf, iOSCon, dotSwift, SwiftConf and more. Sanjeev is a Developer Advocate at IBM Digital Business Group. He mostly focuses on creating code patterns for developers based on AI Data and Analytics using IBM Cloud and Watson services. He is also an open source contributor and highly promotes open source projects.",
226 | hidden: true,
227 | type: .instructor
228 | ),
229 | "carson_mark" : Speaker(
230 | id: 31,
231 | name: "Carson & Mark",
232 | twitter: "onemedical",
233 | imageAssetName: "carson_mark.jpg",
234 | bio: "Carson is a iOS engineer at One Medical, where she finds herself doing everything from app development to building Ruby GraphQL APIs. She is passionate about architecture and design and finds that she can accomplish this best with a complete understanding of the system; backend and frontend. When she is not coding, Carson tries to spend as much time as possible outdoors - enjoying beautiful California! Mark is a senior product designer at One Medical and focuses on creating experiences for doctors and patients. He's also a board member for Inneract Project, a nonprofit that teaches design to underserved youth in the Bay Area. Talk to him about prototyping, design systems, and collaboration.",
235 | hidden: true,
236 | type: .instructor
237 | ),
238 | "davedelong" : Speaker(
239 | id: 32,
240 | name: "Dave DeLong",
241 | twitter: "davedelong",
242 | imageAssetName: "dave_delong.jpg",
243 | bio: "Dave DeLong is a Principal iOS Engineer at WeWork in their Enterprise Technology group. He has a passion for teaching, experimentation, and designing APIs. Prior to joining WeWork, he spent seven years at Apple, where he worked on the UIKit framework, Developer Evangelism, and Apple Maps. Dave, his family, and his large collection of Brandon Sanderson books live near Salt Lake City, where he’s an active member of the local developer community. He can often be found on Twitter teaching developers about all the ways that calendrical calculations can go wrong and pontificating on the virtues of eating chocolate with peanut butter.",
244 | hidden: false,
245 | type: .presentation
246 | ),
247 | "dr" : Speaker(
248 | id: 33,
249 | name: "Dr. Bhaswati Bhattacharya",
250 | twitter: "drbhaswati",
251 | imageAssetName: "dr.jpg",
252 | bio: "Bhaswati is a board-certified holistic physician trained in family medicine and preventive medicine; she is also a scientist trained in pharmacology, neuroscience and ancient ayurvedic chemistry. When she is not working as a Fulbright Specialist 2018-2021 in Global Public Health & Integrative Medicine or as Clinical Assistant Professor in the Dept of Medicine at Cornell Medical College, she is body hacking using ayurvedic bhasmas .... and teaching Ayurveda to students and patients. A documentary film on her work, Healers: Journey into Ayurveda is shown on The Discovery Channel. Her book Everyday Ayurveda is a national bestseller in India published by Penguin Random House.",
253 | hidden: false,
254 | type: .presentation
255 | ),
256 | "cate" : Speaker(
257 | id: 34,
258 | name: "Cate Huston",
259 | twitter: "catehstn",
260 | imageAssetName: "cate.jpg",
261 | bio: "Cate spent her career working on mobile and documenting everything she learnt using WordPress, eventually joining Automattic to combine the two as mobile lead. She has since gone on to lead other teams and now has a broader role across the engineering organization. Cate admins the New-(ish) Manager Slack and her writing on leadership regularly appears in Quartz. You can find her on Twitter at @catehstn and at cate.blog.",
262 | hidden: true,
263 | type: .presentation
264 | ),
265 | "twilio" : Speaker(
266 | id: 35,
267 | name: "Twilio",
268 | twitter: "twilio",
269 | imageAssetName: "twilio_talk.png",
270 | bio: "Twilio has democratized communications channels like voice, text, chat, video, and email by virtualizing the world’s communications infrastructure through APIs that are simple enough for any developer to use, yet robust enough to power the world’s most demanding applications.",
271 | hidden: true,
272 | type: .lightningTalk
273 | ),
274 | "bosear" : Speaker(
275 | id: 36,
276 | name: "Bose AR",
277 | twitter: "bosedevs",
278 | imageAssetName: "bosear_talk.png",
279 | bio: "Bose is enabling developers and creators to make a sound first approach to augmented reality. Through an innovative availability of sensor-driven, head movement and spatial sound capabilities, you can create new experiences that compliment the use of new Bose AR-enabled wearables finding their way to millions of users in 2019.",
280 | hidden: true,
281 | type: .lightningTalk
282 | ),
283 | "agora" : Speaker(
284 | id: 37,
285 | name: "Agora.io",
286 | twitter: "AgoraIO",
287 | imageAssetName: "agora_talk.png",
288 | bio: "Agora delivers easy to embed Real-Time Engagement APIs which includes all the development tools and cloud infrastructure needed for mobile, web, and desktop applications.",
289 | hidden: true,
290 | type: .lightningTalk
291 | )
292 | ]
293 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Sponsors.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Sponsors.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public let nyc2019Sponsors: [String : Sponsor] = [
12 |
13 | //Diamond
14 | "wework" : Sponsor(
15 | name: "wework",
16 | nameJP: nil,
17 | url: "https://www.wework.com/",
18 | displayURL: "wework.com",
19 | logoAssetName: "wework.jpg",
20 | level: .diamond,
21 | priority: 1
22 | ),
23 |
24 | //Platinum
25 | "ibm" : Sponsor(
26 | name: "IBM",
27 | nameJP: nil,
28 | url: "https://www.ibm.com/cloud-computing/bluemix/swift",
29 | displayURL: "ibm.com",
30 | logoAssetName: "IBM.png",
31 | level: .platinum,
32 | priority: 1
33 | ),
34 | "bitrise" : Sponsor(
35 | name: "Bitrise",
36 | nameJP: nil,
37 | url: "https://www.bitrise.io/",
38 | displayURL: "bitrise.io",
39 | logoAssetName: "bitrise.png",
40 | level: .platinum,
41 | priority: 1
42 | ),
43 | "agora" : Sponsor(
44 | name: "Agora.io",
45 | nameJP: nil,
46 | url: "https://www.agora.io/en/",
47 | displayURL: "agora.io",
48 | logoAssetName: "agora.jpg",
49 | level: .platinum,
50 | priority: 1
51 | ),
52 |
53 | //Gold
54 | "jetbrains" : Sponsor(
55 | name: "JetBrains",
56 | nameJP: nil,
57 | url: "https://www.jetbrains.com/",
58 | displayURL: "jetbrains.com",
59 | logoAssetName: "jetbrains.png",
60 | level: .gold,
61 | priority: 1
62 | ),
63 | "bugsnag" : Sponsor(
64 | name: "bugsnag",
65 | nameJP: nil,
66 | url: "https://www.bugsnag.com/",
67 | displayURL: "bugsnag.com",
68 | logoAssetName: "bugsnag.png",
69 | level: .gold,
70 | priority: 1
71 | ),
72 | "mongoDB" : Sponsor(
73 | name: "mongoDB",
74 | nameJP: nil,
75 | url: "https://www.mongodb.com/",
76 | displayURL: "mongodb.com",
77 | logoAssetName: "mongodb.png",
78 | level: .gold,
79 | priority: 1
80 | ),
81 | "twilio" : Sponsor(
82 | name: "Twilio",
83 | nameJP: nil,
84 | url: "https://www.twilio.com",
85 | displayURL: "twilio.com",
86 | logoAssetName: "twilio.png",
87 | level: .gold,
88 | priority: 1
89 | ),
90 | "wayfair" : Sponsor(
91 | name: "Wayfair",
92 | nameJP: nil,
93 | url: "https://www.wayfair.com/",
94 | displayURL: "wayfair.com",
95 | logoAssetName: "wayfair.jpg",
96 | level: .gold,
97 | priority: 1
98 | ),
99 | "bosear" : Sponsor(
100 | name: "Bose AR",
101 | nameJP: nil,
102 | url: "https://developer.bose.com/bose-ar",
103 | displayURL: "developer.bose.com",
104 | logoAssetName: "bosearsquare.png",
105 | level: .gold,
106 | priority: 1
107 | ),
108 |
109 | //Silver
110 | "merrill" : Sponsor(
111 | name: "Merrill Corporation",
112 | nameJP: nil,
113 | url: "https://www.merrillcorp.com",
114 | displayURL: "merrillcorp.com",
115 | logoAssetName: "merrill.png",
116 | level: .silver,
117 | priority: 1
118 | ),
119 |
120 | //Diversity
121 | "lickability" : Sponsor(
122 | name: "Lickability",
123 | nameJP: nil,
124 | url: "http://lickability.com/",
125 | displayURL: "lickability.com",
126 | logoAssetName: "lickability.png",
127 | level: .diversity,
128 | priority: 1
129 | ),
130 | "twitter" : Sponsor(
131 | name: "Twitter",
132 | nameJP: nil,
133 | url: "https://www.twitter.com",
134 | displayURL: "twitter.com",
135 | logoAssetName: "twitter.png",
136 | level: .diversity,
137 | priority: 1
138 | ),
139 | "automattic" : Sponsor(
140 | name: "Automattic",
141 | nameJP: nil,
142 | url: "https://automattic.com/",
143 | displayURL: "automattic.com",
144 | logoAssetName: "automattic.jpg",
145 | level: .diversity,
146 | priority: 1
147 | ),
148 | "merrill_diversity" : Sponsor(
149 | name: "Merrill Corporation",
150 | nameJP: nil,
151 | url: "https://www.merrillcorp.com",
152 | displayURL: "merrillcorp.com",
153 | logoAssetName: "merrill.png",
154 | level: .diversity,
155 | priority: 1
156 | ),
157 |
158 | // Community
159 | "gett" : Sponsor(
160 | name: "Gett",
161 | nameJP: nil,
162 | url: "https://gett.com/juno/",
163 | displayURL: "gett.com",
164 | logoAssetName: "gett.jpg",
165 | level: .community,
166 | priority: 1
167 | ),
168 | "tim" : Sponsor(
169 | name: "Tim Oliver",
170 | nameJP: nil,
171 | url: "http://tim.dev/github",
172 | displayURL: "tim.dev",
173 | logoAssetName: "tim.jpg",
174 | level: .community,
175 | priority: 1
176 | ),
177 | "rift" : Sponsor(
178 | name: "Rift Valley Software",
179 | nameJP: nil,
180 | url: "https://riftvalleysoftware.com",
181 | displayURL: "riftvalleysoftware.com",
182 | logoAssetName: "rift.jpg",
183 | level: .community,
184 | priority: 1
185 | ),
186 | "cody" : Sponsor(
187 | name: "Cody Winton",
188 | nameJP: nil,
189 | url: "https://codywinton.com/",
190 | displayURL: "codywinton.com",
191 | logoAssetName: "cody.jpg",
192 | level: .community,
193 | priority: 1
194 | ),
195 | "orange" : Sponsor(
196 | name: "Orange Loops",
197 | nameJP: nil,
198 | url: "https://orangeloops.com/",
199 | displayURL: "orangeloops.com",
200 | logoAssetName: "orange.png",
201 | level: .community,
202 | priority: 1
203 | )
204 | ]
205 |
--------------------------------------------------------------------------------
/TrySwiftData/Data/NYC-2019/NYC2019Venues.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NYC2016Venues.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/29/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public let nyc2019Venues: [String : Venue] = [
12 | "new-world-stages" : Venue(
13 | title: "New World Stages",
14 | titleJP: nil,
15 | address: "340 W 50th St, New York, NY 10019",
16 | addressJP: nil,
17 | displayAddress: nil,
18 | website: "https://newworldstages.com/",
19 | twitter: "https://twitter.com/newworldstages",
20 | logoAssetName: "nws.jpg",
21 | wifiNetworkName: "try Swift NYC",
22 | wifiUsername: nil,
23 | wifiPassword: "RikoNYC19",
24 | type: .conference
25 | ),
26 | "frames-nyc" : Venue(
27 | title: "Frames Bowling Lounge",
28 | titleJP: nil,
29 | address: "550 9th Ave, New York, NY 10018",
30 | addressJP: nil,
31 | displayAddress: nil,
32 | website: "https://www.framesnyc.com/",
33 | twitter: "https://twitter.com/framesnyc",
34 | logoAssetName: "frames.jpg",
35 | wifiNetworkName: nil,
36 | wifiUsername: nil,
37 | wifiPassword: nil,
38 | type: .party
39 | ),
40 | "websocket-workshop" : Venue(
41 | title: "Build a cloud-ready WebSocket server in Swift",
42 | titleJP: nil,
43 | address: "590 Madison Avenue, Room 12-1220, New York, NY 10022",
44 | addressJP: nil,
45 | displayAddress: "590 Madison Avenue",
46 | website: nil,
47 | twitter: nil,
48 | logoAssetName: "sanjian.png",
49 | wifiNetworkName: nil,
50 | wifiUsername: nil,
51 | wifiPassword: nil,
52 | type: .workshop
53 | ),
54 | "bosear-workshop" : Venue(
55 | title: "Bose AR SDK for Native iOS Workshop",
56 | titleJP: nil,
57 | address: "500 7th Avenue, 8th floor, New York, NY 10018",
58 | addressJP: nil,
59 | displayAddress: "500 7th Avenue",
60 | website: nil,
61 | twitter: nil,
62 | logoAssetName: "bosearsquare.png",
63 | wifiNetworkName: nil,
64 | wifiUsername: nil,
65 | wifiPassword: nil,
66 | type: .workshop
67 | ),
68 | "prototyping-workshop" : Venue(
69 | title: "Technology Experience Prototyping",
70 | titleJP: nil,
71 | address: "116 W 23rd St, 5th floor, New York, NY 10011",
72 | addressJP: nil,
73 | displayAddress: "116 W 23rd St",
74 | website: nil,
75 | twitter: nil,
76 | logoAssetName: "carson_mark.jpg",
77 | wifiNetworkName: nil,
78 | wifiUsername: nil,
79 | wifiPassword: nil,
80 | type: .workshop
81 | ),
82 | "pi-workshop" : Venue(
83 | title: "Swift on the Raspberry PI - Building A Circuit to Control an LED",
84 | titleJP: nil,
85 | address: "500 7th Avenue, 7th floor, New York, NY 10018",
86 | addressJP: nil,
87 | displayAddress: "500 7th Avenue",
88 | website: nil,
89 | twitter: nil,
90 | logoAssetName: "marc.jpg",
91 | wifiNetworkName: nil,
92 | wifiUsername: nil,
93 | wifiPassword: nil,
94 | type: .workshop
95 | ),
96 | "swiftui-workshop" : Venue(
97 | title: "SwiftUI Hands-on",
98 | titleJP: nil,
99 | address: "20 West 23rd Street, 5th floor, New York, NY 10010",
100 | addressJP: nil,
101 | displayAddress: "20 West 23rd Street",
102 | website: nil,
103 | twitter: nil,
104 | logoAssetName: "paul.jpg",
105 | wifiNetworkName: nil,
106 | wifiUsername: nil,
107 | wifiPassword: nil,
108 | type: .workshop
109 | ),
110 | "fractal-workshop" : Venue(
111 | title: "Fractal: Atomic Design Theory with Declarative UI (think SwiftUI for Today)",
112 | titleJP: nil,
113 | address: "61 W 23rd St, 3rd Floor, New York, NY 10010",
114 | addressJP: nil,
115 | displayAddress: "61 W 23rd St",
116 | website: nil,
117 | twitter: nil,
118 | logoAssetName: "jonbott.jpg",
119 | wifiNetworkName: nil,
120 | wifiUsername: nil,
121 | wifiPassword: nil,
122 | type: .workshop
123 | ),
124 | "combine-workshop" : Venue(
125 | title: "Super Easy Combine - This is an Awesome App Workshop",
126 | titleJP: nil,
127 | address: "154 Grand Street, New York, NY 10013",
128 | addressJP: nil,
129 | displayAddress: "154 Grand Street",
130 | website: nil,
131 | twitter: nil,
132 | logoAssetName: "pauls.jpg",
133 | wifiNetworkName: nil,
134 | wifiUsername: nil,
135 | wifiPassword: nil,
136 | type: .workshop
137 | ),
138 | "communication-workshop" : Venue(
139 | title: "Professional Communication Skill-Building",
140 | titleJP: nil,
141 | address: "420 9th Avenue, 2nd floor, New York, NY 10001",
142 | addressJP: nil,
143 | displayAddress: "420 9th Avenue",
144 | website: nil,
145 | twitter: nil,
146 | logoAssetName: "chris-workshop.jpg",
147 | wifiNetworkName: nil,
148 | wifiUsername: nil,
149 | wifiPassword: nil,
150 | type: .workshop
151 | ),
152 | ]
153 |
154 |
155 |
--------------------------------------------------------------------------------
/TrySwiftData/Extensions/Array+TrySwiftData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Array+TrySwiftData.swift
3 | // Pods-TrySwiftData_Tests
4 | //
5 | // Created by Natasha Murashev on 2/22/18.
6 | //
7 |
8 | import Foundation
9 |
10 | extension Array {
11 | func dictionary() -> [K: V] where Element == Dictionary.Element {
12 | var dictionary = [K: V]()
13 | for element in self {
14 | dictionary[element.key] = element.value
15 | }
16 | return dictionary
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/TrySwiftData/Extensions/Bundle+TrySwiftData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Bundle+TrySwiftData.swift
3 | // Pods
4 | //
5 | // Created by Tim Oliver on 2/14/17.
6 | //
7 | //
8 |
9 | import Foundation
10 |
11 | extension Bundle {
12 |
13 | public class func trySwiftDataBundle() -> Bundle {
14 | // Return the Resource Bundle
15 | let bundleURL = Bundle.trySwiftResourceBundleURL()
16 | return Bundle(url: bundleURL)!
17 | }
18 |
19 | public class func trySwiftResourceBundleURL() -> URL {
20 | let classBundle = Conference.conferenceBundle
21 | if let bundleURL = classBundle.url(forResource: "TrySwiftData", withExtension: "bundle") {
22 | return bundleURL
23 | }
24 | return Bundle.main.bundleURL
25 | }
26 |
27 | public class func trySwiftAssetURL(for name: String) -> URL? {
28 | let bundle = Bundle.trySwiftDataBundle()
29 | return bundle.url(forResource: name, withExtension: nil)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/TrySwiftData/Extensions/Date+Timepiece.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Date+Timepiece.swift
3 | // trySwiftData
4 | //
5 | // Created by Tim Oliver on 2/12/17.
6 | // Copyright © 2017 CocoaPods. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // taken from https://github.com/naoty/Timepiece
12 |
13 | extension Date {
14 |
15 | // MARK: - Get components
16 |
17 | var year: Int {
18 | return components.year!
19 | }
20 |
21 | var month: Int {
22 | return components.month!
23 | }
24 |
25 | var weekday: Int {
26 | return components.weekday!
27 | }
28 |
29 | var day: Int {
30 | return components.day!
31 | }
32 |
33 | var hour: Int {
34 | return components.hour!
35 | }
36 |
37 | var minute: Int {
38 | return components.minute!
39 | }
40 |
41 | var second: Int {
42 | return components.second!
43 | }
44 |
45 | fileprivate var calendar: Calendar {
46 | var calendar = Calendar(identifier: .gregorian)
47 | calendar.timeZone = TimeZone(secondsFromGMT: 0)!
48 | return calendar
49 | }
50 |
51 | fileprivate var components: DateComponents {
52 | return (calendar as NSCalendar).components([.year, .month, .weekday, .day, .hour, .minute, .second], from: self)
53 | }
54 |
55 | public static func date(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int) -> Date {
56 | let now = Date()
57 | return now.change(year: year, month: month, day: day, hour: hour, minute: minute, second: second)
58 | }
59 |
60 | static func date(year: Int, month: Int, day: Int) -> Date {
61 | return Date.date(year: year, month: month, day: day, hour: 0, minute: 0, second: 0)
62 | }
63 |
64 | /**
65 | Initialize a date by changing date components of the receiver.
66 | */
67 | func change(year: Int? = nil, month: Int? = nil, day: Int? = nil, hour: Int? = nil, minute: Int? = nil, second: Int? = nil) -> Date! {
68 | var components = self.components
69 | components.year = year ?? self.year
70 | components.month = month ?? self.month
71 | components.day = day ?? self.day
72 | components.hour = hour ?? self.hour
73 | components.minute = minute ?? self.minute
74 | components.second = second ?? self.second
75 | return calendar.date(from: components)
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/TrySwiftData/Extensions/Object+LocalizedProperty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Object+LocalizedProperty.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 2/7/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | public func localizedString(for englishString: String, japaneseString: String?) -> String {
13 | // Get the current language code of the device
14 | let languageCode = NSLocale.preferredLanguages.first
15 |
16 | // Ensure a valid code was provided
17 | guard let code = languageCode else {
18 | return englishString
19 | }
20 |
21 | if code.contains("ja") {
22 | guard let japaneseString = japaneseString else {
23 | return englishString
24 | }
25 |
26 | return japaneseString
27 | }
28 |
29 | return englishString
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/TrySwiftData/Extensions/String+TrySwiftData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+TrySwiftData.swift
3 | // Pods
4 | //
5 | // Created by Tim Oliver on 2/19/17.
6 | //
7 | //
8 |
9 | import Foundation
10 |
11 | extension String {
12 | internal func localized() -> String {
13 | let bundle = Bundle.trySwiftDataBundle()
14 | return NSLocalizedString(self, tableName: "TrySwiftDataLocalizable", bundle: bundle, comment: "")
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Conference.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Conference.swift
3 | // trySwift
4 | //
5 | // Created by Bas Broek on 04/08/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public struct Conference {
10 | public let name: String
11 | public let twitter: String
12 | public let logoAssetName: String?
13 | public let conferenceDescription: String
14 | public let conferenceDescriptionJP: String?
15 | public let email: String
16 | public let slackURL: String
17 | public let slackTeamID: String
18 | public let githubIssuesURL = "https://github.com/tryswift/trySwiftAppFinal/issues"
19 | public let codeOfConductURL = "https://www.tryswift.co/code-of-conduct/"
20 | public let venues: [Venue]
21 | public let organizers: [Organizer]
22 | public let emojiSet: String
23 | public let timezone: String
24 | public let dateFormat: String
25 |
26 | class BundleIdenifier { }
27 | static var conferenceBundle: Bundle { return Bundle(for: Conference.BundleIdenifier.self) }
28 |
29 | public var localizedDescription: String {
30 | return localizedString(for: conferenceDescription, japaneseString: conferenceDescriptionJP)
31 | }
32 |
33 | public static var current: Conference {
34 | return nyc2019Conferences.first!
35 | }
36 |
37 | public var logoURL: URL {
38 | if let assetName = logoAssetName {
39 | return Bundle.trySwiftAssetURL(for: assetName)!
40 | }
41 |
42 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/ConferenceDay.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConferenceDay.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public struct ConferenceDay {
10 | /* The date of this particular day of the conference. */
11 | public let date: Date
12 |
13 | /* The list of sessions, sorted into time blocks for that day. */
14 | public let sessionBlocks: [SessionBlock]
15 |
16 | public static let all = nyc2019ConferenceDays.sorted { $0.date < $1.date }
17 | }
18 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Event.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Event.swift
3 | // trySwift
4 | //
5 | // Created by Natasha Murashev on 8/16/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public struct Event {
10 | public let title: String
11 | public let titleJP: String?
12 | public let logoAssetName: String?
13 | public let location: String
14 | public let locationJP: String?
15 | public let website: String?
16 |
17 | public var localizedTitle: String {
18 | return localizedString(for: title, japaneseString: titleJP)
19 | }
20 |
21 | public var localizedLocation: String {
22 | return localizedString(for: location, japaneseString: locationJP)
23 | }
24 |
25 | public var logoURL: URL {
26 | if let assetName = logoAssetName {
27 | return Bundle.trySwiftAssetURL(for: assetName)!
28 | }
29 |
30 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Location.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Location.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public struct Location {
10 | public let name: String
11 | public let nameJP: String?
12 |
13 | init(name: String, nameJP: String? = nil) {
14 | self.name = name
15 | self.nameJP = nameJP
16 | }
17 |
18 | public var localizedName: String {
19 | return localizedString(for: name, japaneseString: nameJP)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Organizer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Organizer.swift
3 | // Pods
4 | //
5 | // Created by Tim Oliver on 2/16/17.
6 | //
7 | //
8 |
9 | import Foundation
10 |
11 | public struct Organizer {
12 | public let id: Int
13 | public let name: String
14 | public let nameJP: String?
15 | public let twitter: String
16 | public let imageAssetName: String?
17 | public let bio: String
18 | public let bioJP: String?
19 | public let hidden: Bool
20 |
21 | public static var all: [Organizer] {
22 | // let organizers = tko2019Organizers.filter { $0.value.hidden == false}
23 | //let sortedOrganizers = organizers.sorted { $0.value.name < $1.value.name }
24 | //return sortedOrganizers.dictionary()
25 | return nyc2019Organizers
26 | }
27 |
28 | public var localizedName: String {
29 | return localizedString(for: name, japaneseString: nameJP)
30 | }
31 |
32 | public var localizedBio: String {
33 | return localizedString(for: bio, japaneseString: bioJP)
34 | }
35 |
36 | public var imageURL: URL {
37 | if let assetName = imageAssetName {
38 | return Bundle.trySwiftAssetURL(for: assetName)!
39 | }
40 |
41 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Presentation.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Presentation.swift
3 | // trySwift
4 | //
5 | // Created by Natasha Murashev on 2/10/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct Presentation {
12 | public let id: Int
13 | public let speaker: Speaker?
14 | public let title: String
15 | public let titleJP: String?
16 | public let summary: String
17 | public let summaryJP: String?
18 |
19 | init(id: Int,
20 | speaker: Speaker?,
21 | title: String,
22 | titleJP: String? = nil,
23 | summary: String,
24 | summaryJP: String? = nil
25 | ) {
26 | self.id = id
27 | self.speaker = speaker
28 | self.title = title
29 | self.titleJP = titleJP
30 | self.summary = summary
31 | self.summaryJP = summaryJP
32 | }
33 |
34 | public var localizedTitle: String {
35 | return localizedString(for: title, japaneseString: titleJP)
36 | }
37 |
38 | public var localizedSummary: String {
39 | return localizedString(for: summary, japaneseString: summaryJP)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Session.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Session.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public enum SessionType: Int {
12 | case workshop
13 | case meetup
14 | case breakfast
15 | case announcement
16 | case talk
17 | case lightningTalk
18 | case sponsoredDemo
19 | case coffeeBreak
20 | case lunch
21 | case officeHours
22 | case party
23 | case registration
24 | case panel
25 | }
26 |
27 | public struct Session {
28 | /** The type of content in this particular session */
29 | public let type: SessionType
30 |
31 | /** The title of this session (if not provided by any child objects) */
32 | public let title: String?
33 |
34 | /** The Japanese title of this session (if not provided by any child objects) */
35 | public let titleJP: String?
36 |
37 | /** For special cases, the name of the image to show for this session. */
38 | public let imageAssetName: String?
39 |
40 | /** A sponsor, if any, responsible for this session. */
41 | public let sponsor: Sponsor?
42 |
43 | /** The presentation information if this session is a talk. */
44 | public let presentation: Presentation?
45 |
46 | /** The specific room this session will be held */
47 | public let location: Location?
48 |
49 | /** A special type of event occuring during the conference */
50 | public let event: Event?
51 |
52 | /** Any particular events held at a different venue from the conference */
53 | public let venue: Venue?
54 |
55 | /***************************************************/
56 |
57 | init(type: SessionType,
58 | title: String? = nil,
59 | titleJP: String? = nil,
60 | imageAssetName: String? = nil,
61 | sponsor: Sponsor? = nil,
62 | presentation: Presentation? = nil,
63 | location: Location? = nil,
64 | event: Event? = nil,
65 | venue: Venue? = nil
66 | ) {
67 | self.type = type
68 | self.title = title
69 | self.titleJP = titleJP
70 | self.imageAssetName = imageAssetName
71 | self.sponsor = sponsor
72 | self.presentation = presentation
73 | self.location = location
74 | self.event = event
75 | self.venue = venue
76 | }
77 |
78 | public static var all: [String: Session] {
79 | return nyc2019Sessions
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/SessionBlock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SessionTimeBlock.swift
3 | // TrySwiftData
4 | //
5 | // Created by Tim Oliver on 1/28/17.
6 | // Copyright © 2017 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public struct SessionBlock {
10 | /* The time in which these sessions start */
11 | public let startTime: Date
12 |
13 | /* The time in which they end */
14 | public let endTime: Date
15 |
16 | /* The sessions occurring within this block. */
17 | public let sessions: [Session]
18 |
19 | public static var all: [SessionBlock] {
20 | return nyc2019SessionBlocks
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Speaker.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Speaker.swift
3 | // trySwift
4 | //
5 | // Created by Natasha Murashev on 2/10/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | public enum SpeakerType: Int {
10 | case presentation
11 | case lightningTalk
12 | case instructor
13 | case emcee
14 | }
15 |
16 | public struct Speaker {
17 | public let id: Int
18 | public let name: String
19 | public let nameJP: String?
20 | public let twitter: String
21 | public let imageAssetName: String?
22 | public let imageWebURL: String?
23 | public let bio: String
24 | public let bioJP: String?
25 | public let hidden: Bool
26 | public let type: SpeakerType
27 |
28 |
29 | init(id: Int,
30 | name: String,
31 | nameJP: String? = nil,
32 | twitter: String,
33 | imageAssetName: String?,
34 | imageWebURL: String? = nil,
35 | bio: String,
36 | bioJP: String? = nil,
37 | hidden: Bool = false,
38 | type: SpeakerType = .presentation) {
39 | self.id = id
40 | self.name = name
41 | self.nameJP = nameJP
42 | self.twitter = twitter
43 | self.imageAssetName = imageAssetName
44 | self.imageWebURL = imageWebURL
45 | self.bio = bio
46 | self.bioJP = bioJP
47 | self.hidden = hidden
48 | self.type = type
49 | }
50 |
51 | public static var all: [Speaker] {
52 | let speakers = nyc2019Speakers.values.filter { $0.hidden == false}
53 | return speakers.sorted { $0.name < $1.name }
54 | }
55 |
56 | public var localizedName: String {
57 | return localizedString(for: name, japaneseString: nameJP)
58 | }
59 |
60 | public var localizedBio: String {
61 | return localizedString(for: bio, japaneseString: bioJP)
62 | }
63 |
64 | public var imageURL: URL? {
65 | if let url = imageWebURL, !url.isEmpty {
66 | return URL(string: url)!
67 | }
68 |
69 | if let assetName = imageAssetName {
70 | return Bundle.trySwiftAssetURL(for: assetName)!
71 | }
72 |
73 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
74 | }
75 | }
76 |
77 |
78 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Sponsor.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sponsor.swift
3 | // trySwift
4 | //
5 | // Created by Natasha Murashev on 2/10/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public enum SponsorLevel: Int {
12 | case diamond
13 | case platinum
14 | case gold
15 | case silver
16 | case diversity
17 | case student
18 | case event
19 | case lanyard
20 | case bag
21 | case individual
22 | case community
23 | }
24 |
25 | public struct Sponsor {
26 | public let name: String
27 | public let nameJP: String?
28 | public let url: String
29 | public let displayURL: String
30 | public let twitter: String?
31 | public let logoAssetName: String?
32 | public let level: SponsorLevel
33 | public let priority: Int
34 |
35 | init(name: String,
36 | nameJP: String? = nil,
37 | url: String,
38 | displayURL: String,
39 | twitter: String? = nil,
40 | logoAssetName: String?,
41 | level: SponsorLevel,
42 | priority: Int
43 | ) {
44 | self.name = name
45 | self.nameJP = nameJP
46 | self.url = url
47 | self.displayURL = displayURL
48 | self.twitter = twitter
49 | self.logoAssetName = logoAssetName
50 | self.level = level
51 | self.priority = priority
52 | }
53 |
54 | public var localizedName: String {
55 | return localizedString(for: name, japaneseString: nameJP)
56 | }
57 |
58 | public var logoURL: URL {
59 | if let assetName = logoAssetName {
60 | return Bundle.trySwiftAssetURL(for: assetName)!
61 | }
62 |
63 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
64 | }
65 |
66 | /* Return an array of `Results` objects */
67 | public static var all: [Int : [Sponsor]] {
68 |
69 | var resultsSet = [ Int : [Sponsor] ]()
70 | for i in 0...SponsorLevel.individual.rawValue {
71 | let sponsors = nyc2019Sponsors.filter { $0.value.level.rawValue == i }
72 |
73 | if sponsors.count > 0 {
74 | let sponsorsSorted = sponsors.sorted { $0.value.priority < $1.value.priority }
75 | // let sponsorsSorted = sponsors.sorted { $0.value.name < $1.value.name }
76 | resultsSet[i] = sponsorsSorted.map { $0.value }
77 | }
78 | }
79 |
80 | return resultsSet
81 | }
82 |
83 | public static func localizedName(for sponsorLevel: SponsorLevel) -> String {
84 | switch sponsorLevel {
85 | case .diamond: return "Diamond".localized()
86 | case .platinum: return "Platinum".localized()
87 | case .gold: return "Gold".localized()
88 | case .silver: return "Silver".localized()
89 | case .diversity: return "Diversity".localized()
90 | case .student: return "Student".localized()
91 | case .event: return "Event".localized()
92 | case .lanyard: return "Lanyard".localized()
93 | case .bag: return "Bag".localized()
94 | case .individual: return "Individual".localized()
95 | case .community: return "Community".localized()
96 | }
97 | }
98 | }
99 |
100 |
--------------------------------------------------------------------------------
/TrySwiftData/Models/Venue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Venue.swift
3 | // trySwift
4 | //
5 | // Created by Natasha Murashev on 8/15/16.
6 | // Copyright © 2016 NatashaTheRobot. All rights reserved.
7 | //
8 |
9 | import Contacts
10 |
11 | public enum VenueType: Int {
12 | case conference
13 | case hackathon
14 | case party
15 | case workshop
16 | }
17 |
18 | public struct Venue {
19 | public let title: String
20 | public let titleJP: String?
21 | public let address: String
22 | public let addressJP: String?
23 | public let displayAddress: String?
24 | public let website: String?
25 | public let twitter: String?
26 | public let logoAssetName: String?
27 | public let wifiNetworkName: String?
28 | public let wifiUsername: String?
29 | public let wifiPassword: String?
30 | public let type: VenueType
31 |
32 | public var localizedTitle: String {
33 | return localizedString(for: title, japaneseString: titleJP)
34 | }
35 |
36 | public var localizedAddress: String {
37 | return localizedString(for: address, japaneseString: addressJP)
38 | }
39 |
40 | public var logoURL: URL {
41 | if let assetName = logoAssetName {
42 | return Bundle.trySwiftAssetURL(for: assetName)!
43 | }
44 |
45 | return Bundle.trySwiftAssetURL(for: "Logo.png")!
46 | }
47 |
48 | public static func localizedName(for venueType: VenueType) -> String {
49 | switch venueType {
50 | case .conference: return "Conference".localized()
51 | case .hackathon: return "Hackathon".localized()
52 | case .party: return "Party".localized()
53 | case .workshop: return "Workshop".localized()
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDataDefaults.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SessionDefaults.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct SessionDataDefaults: SessionDisplayable {
10 |
11 | let customImageAssetURL: URL?
12 |
13 | fileprivate let session: Session
14 |
15 | init(session: Session) {
16 | self.session = session
17 |
18 | if let assetName = session.imageAssetName {
19 | customImageAssetURL = Bundle.trySwiftAssetURL(for: assetName)
20 | } else {
21 | customImageAssetURL = nil
22 | }
23 | }
24 |
25 | var title: String {
26 | return localizedString(for: session.title ?? "TBD", japaneseString: session.titleJP)
27 | }
28 |
29 | var presenter: String {
30 | return Conference.current.name
31 | }
32 |
33 |
34 | var imageURL: URL {
35 | return Conference.current.logoURL
36 | }
37 |
38 |
39 | var location: String {
40 | if let location = session.location {
41 | return location.localizedName
42 | } else {
43 | return Venue.localizedName(for: .conference)
44 | }
45 | }
46 |
47 | var shortDescription: String {
48 | return "❤️".localized()
49 | }
50 |
51 | var longDescription: String {
52 | return Conference.current.localizedDescription
53 | }
54 |
55 | var twitter: String {
56 | return Conference.current.twitter
57 | }
58 |
59 | var selectable: Bool {
60 | return false
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SessionDisplayableProtocol.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | protocol SessionDisplayable {
10 |
11 | /** The main name of this session */
12 | var title: String { get }
13 |
14 | /** Who is in charge of this session */
15 | var presenter: String { get }
16 |
17 | /** What image, if any is available for this session */
18 | var imageURL: URL { get }
19 |
20 | /** The location for where this session will occur */
21 | var location: String { get }
22 |
23 | /** A short-form description of the session */
24 | var shortDescription: String { get }
25 |
26 | /** A long-form description of the session */
27 | var longDescription: String { get }
28 |
29 | /** What Twitter handle, if any represents this session */
30 | var twitter: String { get }
31 |
32 | /** Whether this type of session requires a new view controller to display more information */
33 | var selectable: Bool { get }
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/AnnouncementSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnnouncementSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct AnnouncementSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .announcement {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | return dataDefaults.title
25 | }
26 |
27 | var presenter: String {
28 | return dataDefaults.presenter
29 | }
30 |
31 | var imageURL: URL {
32 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
33 | }
34 |
35 | var location: String {
36 | return dataDefaults.location
37 | }
38 |
39 | var shortDescription: String {
40 | return "📣".localized()
41 | }
42 |
43 | var longDescription: String {
44 | return dataDefaults.longDescription
45 | }
46 |
47 | var selectable: Bool {
48 | return false
49 | }
50 |
51 | var twitter: String {
52 | return "@\(dataDefaults.twitter)"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/BreakfastSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreakfastSession.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct BreakfastSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .breakfast {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | return dataDefaults.title
25 | }
26 |
27 | var presenter: String {
28 | return dataDefaults.presenter
29 | }
30 |
31 | var imageURL: URL {
32 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
33 | }
34 |
35 | var location: String {
36 | return dataDefaults.location
37 | }
38 |
39 | var shortDescription: String {
40 | return dataDefaults.shortDescription
41 | }
42 |
43 | var longDescription: String {
44 | return dataDefaults.longDescription
45 | }
46 |
47 | var selectable: Bool {
48 | return false
49 | }
50 |
51 | var twitter: String {
52 | return "@\(dataDefaults.twitter)"
53 | }
54 | }
55 |
56 |
57 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/CoffeeBreakSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CoffeeBreakSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct CoffeeBreakSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .coffeeBreak {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | if let sponsor = session.sponsor {
25 | return String(format: "Coffee Break, by %@".localized(), sponsor.name)
26 | }
27 | return "Coffee Break".localized()
28 | }
29 |
30 | var presenter: String {
31 | if let sponsor = session.sponsor {
32 | return sponsor.localizedName
33 | }
34 | return dataDefaults.presenter
35 | }
36 |
37 | var imageURL: URL {
38 | if let imageURL = dataDefaults.customImageAssetURL {
39 | return imageURL
40 | }
41 |
42 | if let sponsor = session.sponsor {
43 | return sponsor.logoURL
44 | }
45 |
46 | return dataDefaults.imageURL
47 | }
48 |
49 | var location: String {
50 | return dataDefaults.location
51 | }
52 |
53 | var shortDescription: String {
54 | return dataDefaults.shortDescription
55 | }
56 |
57 | var longDescription: String {
58 | return dataDefaults.longDescription
59 | }
60 |
61 | var selectable: Bool {
62 | return session.sponsor != nil
63 | }
64 |
65 | var twitter: String {
66 | let twitter = session.sponsor?.twitter ?? dataDefaults.twitter
67 | return "@\(twitter)"
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/LightningTalkSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LightningTalkSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct LightningTalkSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .lightningTalk {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | guard let presentation = session.presentation else { return dataDefaults.title }
25 | return presentation.localizedTitle
26 | }
27 |
28 | var presenter: String {
29 | if let presentation = session.presentation {
30 | return presentation.speaker?.localizedName ?? "TBD"
31 | }
32 | return "TBD"
33 | }
34 |
35 | var imageURL: URL {
36 | if let imageURL = dataDefaults.customImageAssetURL {
37 | return imageURL
38 | }
39 |
40 | if let speakerImage = session.presentation?.speaker?.imageURL {
41 | return speakerImage
42 | }
43 |
44 | return dataDefaults.imageURL
45 | }
46 |
47 | var location: String {
48 | return dataDefaults.location
49 | }
50 |
51 | var shortDescription: String {
52 | return "⚡️🎤 Lightning Talk".localized()
53 | }
54 |
55 | var longDescription: String {
56 | return session.presentation?.localizedSummary ?? dataDefaults.longDescription
57 | }
58 |
59 | var selectable: Bool {
60 | return session.presentation != nil
61 | }
62 |
63 | var twitter: String {
64 | let twitter = session.presentation?.speaker?.twitter ?? dataDefaults.twitter
65 | return "@\(twitter)"
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/LunchSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LunchSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct LunchSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .lunch {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | return "Lunch".localized()
25 | }
26 |
27 | var presenter: String {
28 | return dataDefaults.presenter
29 | }
30 |
31 | var imageURL: URL {
32 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
33 | }
34 |
35 | var location: String {
36 | return dataDefaults.location
37 | }
38 |
39 | var shortDescription: String {
40 | return "🌯".localized()
41 | }
42 |
43 | var longDescription: String {
44 | return dataDefaults.longDescription
45 | }
46 |
47 | var selectable: Bool {
48 | return false
49 | }
50 |
51 | var twitter: String {
52 | return "@\(dataDefaults.twitter)"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/MeetupSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MeetupSession.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct MeetupSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .meetup {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | guard let event = session.event else { return dataDefaults.title }
25 | return event.localizedTitle
26 | }
27 |
28 | var presenter: String {
29 | if let sponsor = session.sponsor {
30 | return sponsor.localizedName
31 | }
32 | return dataDefaults.presenter
33 | }
34 |
35 | var imageURL: URL {
36 | if let imageURL = dataDefaults.customImageAssetURL {
37 | return imageURL
38 | }
39 |
40 | if let event = session.event {
41 | return event.logoURL
42 | }
43 |
44 | return dataDefaults.imageURL
45 | }
46 |
47 | var location: String {
48 | if let event = session.event {
49 | return event.localizedLocation
50 | }
51 |
52 | return dataDefaults.location
53 | }
54 |
55 | var shortDescription: String {
56 | return "Special Event".localized()
57 | }
58 |
59 | var longDescription: String {
60 | return dataDefaults.longDescription
61 | }
62 |
63 |
64 | var selectable: Bool {
65 | return session.event != nil
66 | }
67 |
68 | var twitter: String {
69 | let twitter = session.sponsor?.twitter ?? dataDefaults.twitter
70 | return "@\(twitter)"
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/OfficeHoursSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OfficeHoursSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct OfficeHoursSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .officeHours {
16 | self.session = session
17 | dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | guard let speaker = session.presentation?.speaker?.localizedName else {
25 | return "Office Hours".localized()
26 | }
27 | return String(format: "Office Hours with %@".localized(), speaker)
28 | }
29 |
30 | var presenter: String {
31 | if let presentation = session.presentation {
32 | return presentation.speaker?.localizedName ?? "⁉️"
33 | }
34 | return "⁉️"
35 | }
36 |
37 | var imageURL: URL {
38 | if let imageURL = dataDefaults.customImageAssetURL {
39 | return imageURL
40 | }
41 |
42 | if let speakerImage = session.presentation?.speaker?.imageURL {
43 | return speakerImage
44 | }
45 |
46 | return dataDefaults.imageURL
47 | }
48 |
49 | var location: String {
50 | return dataDefaults.location
51 | }
52 |
53 | var shortDescription: String {
54 | return "Q&A".localized()
55 | }
56 |
57 | var longDescription: String {
58 | return session.presentation?.speaker?.localizedBio ?? dataDefaults.longDescription
59 | }
60 |
61 | var selectable: Bool {
62 | return true
63 | }
64 |
65 | var twitter: String {
66 | let twitter = session.presentation?.speaker?.twitter ?? dataDefaults.twitter
67 | return "@\(twitter)"
68 | }
69 |
70 | }
71 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/PanelSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PanelSessionViewModel.swift
3 | // TrySwiftData-TrySwiftData
4 | //
5 | // Created by Natasha Murashev on 6/4/18.
6 | //
7 |
8 | import Foundation
9 |
10 | struct PanelSessionViewModel: SessionDisplayable {
11 |
12 | private let session: Session
13 | private let dataDefaults: SessionDataDefaults
14 |
15 | init?(_ session: Session) {
16 | if session.type == .panel {
17 | self.session = session
18 | self.dataDefaults = SessionDataDefaults(session: session)
19 | } else {
20 | return nil
21 | }
22 | }
23 |
24 | var title: String {
25 | return dataDefaults.title
26 | }
27 |
28 | var presenter: String {
29 | return dataDefaults.presenter
30 | }
31 |
32 | var imageURL: URL {
33 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
34 | }
35 |
36 | var location: String {
37 | return dataDefaults.location
38 | }
39 |
40 | var shortDescription: String {
41 | return "🎤".localized()
42 | }
43 |
44 | var longDescription: String {
45 | return dataDefaults.longDescription
46 | }
47 |
48 | var selectable: Bool {
49 | return false
50 | }
51 |
52 | var twitter: String {
53 | return "@\(dataDefaults.twitter)"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/PartySessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PartySessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct PartySessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .party {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | return dataDefaults.title
25 | }
26 |
27 | var presenter: String {
28 | return dataDefaults.presenter
29 | }
30 |
31 | var imageURL: URL {
32 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
33 | }
34 |
35 | var location: String {
36 | return session.venue!.localizedTitle
37 | }
38 |
39 | var shortDescription: String {
40 | return "🎉🎉🎉".localized()
41 | }
42 |
43 | var longDescription: String {
44 | return dataDefaults.longDescription
45 | }
46 |
47 |
48 | var selectable: Bool {
49 | return true
50 | }
51 |
52 | var twitter: String {
53 | return "@\(dataDefaults.twitter)"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/RegistrationSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RegistrationSessionViewModel.swift
3 | // TrySwiftData-TrySwiftData
4 | //
5 | // Created by Natasha Murashev on 6/3/18.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RegistrationSessionViewModel: SessionDisplayable {
11 |
12 | private let session: Session
13 | private let dataDefaults: SessionDataDefaults
14 |
15 | init?(_ session: Session) {
16 | if session.type == .registration {
17 | self.session = session
18 | self.dataDefaults = SessionDataDefaults(session: session)
19 | } else {
20 | return nil
21 | }
22 | }
23 |
24 | var title: String {
25 | return dataDefaults.title
26 | }
27 |
28 | var presenter: String {
29 | return dataDefaults.presenter
30 | }
31 |
32 | var imageURL: URL {
33 | return dataDefaults.customImageAssetURL ?? dataDefaults.imageURL
34 | }
35 |
36 | var location: String {
37 | return dataDefaults.location
38 | }
39 |
40 | var shortDescription: String {
41 | return "✍️".localized()
42 | }
43 |
44 | var longDescription: String {
45 | return dataDefaults.longDescription
46 | }
47 |
48 | var selectable: Bool {
49 | return false
50 | }
51 |
52 | var twitter: String {
53 | return "@\(dataDefaults.twitter)"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/SponsoredDemoSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SponsoredDemoSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct SponsoredDemoSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | private let sponsor: Sponsor
15 |
16 | init?(_ session: Session) {
17 | if session.type == .sponsoredDemo {
18 | self.session = session
19 | dataDefaults = SessionDataDefaults(session: session)
20 | sponsor = session.sponsor!
21 | } else {
22 | return nil
23 | }
24 | }
25 |
26 | var title: String {
27 | return "Sponsored Demo".localized()
28 | }
29 |
30 | var presenter: String {
31 | return sponsor.localizedName
32 | }
33 |
34 | var imageURL: URL {
35 | if let imageURL = dataDefaults.customImageAssetURL {
36 | return imageURL
37 | }
38 |
39 | return sponsor.logoURL
40 | }
41 |
42 | var location: String {
43 | return dataDefaults.location
44 | }
45 |
46 | var shortDescription: String {
47 | return "Demo".localized()
48 | }
49 |
50 | var longDescription: String {
51 | return dataDefaults.longDescription
52 | }
53 |
54 | var selectable: Bool {
55 | return true
56 | }
57 |
58 | var twitter: String {
59 | return "@\(sponsor.twitter!)"
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/TalkSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TalkSessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct TalkSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | private let presentation: Presentation
15 |
16 | init?(_ session: Session) {
17 | if session.type == .talk {
18 | self.session = session
19 | dataDefaults = SessionDataDefaults(session: session)
20 | presentation = session.presentation!
21 | } else {
22 | return nil
23 | }
24 | }
25 |
26 | var title: String {
27 | return presentation.localizedTitle
28 | }
29 |
30 | var presenter: String {
31 | return presentation.speaker?.localizedName ?? "TBD"
32 | }
33 |
34 | var imageURL: URL {
35 | if let imageURL = dataDefaults.customImageAssetURL {
36 | return imageURL
37 | }
38 |
39 | if let speakerImage = presentation.speaker?.imageURL {
40 | return speakerImage
41 | }
42 |
43 | return dataDefaults.imageURL
44 | }
45 |
46 | var location: String {
47 | return dataDefaults.location
48 | }
49 |
50 | var shortDescription: String {
51 | return "Presentation".localized()
52 | }
53 |
54 | var longDescription: String {
55 | return presentation.localizedSummary
56 | }
57 |
58 | var selectable: Bool {
59 | return true
60 | }
61 |
62 | var twitter: String {
63 | let twitter = presentation.speaker?.twitter ?? dataDefaults.twitter
64 | return "@\(twitter)"
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionTypeViewModels/SessionDisplayableTypes/WorkshopSessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WorkshopSession.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | struct WorkshopSessionViewModel: SessionDisplayable {
10 |
11 | private let session: Session
12 | private let dataDefaults: SessionDataDefaults
13 |
14 | init?(_ session: Session) {
15 | if session.type == .workshop {
16 | self.session = session
17 | self.dataDefaults = SessionDataDefaults(session: session)
18 | } else {
19 | return nil
20 | }
21 | }
22 |
23 | var title: String {
24 | if let event = session.event {
25 | return event.localizedTitle
26 | }
27 |
28 | if let presentation = session.presentation {
29 | return presentation.localizedTitle
30 | }
31 |
32 | return dataDefaults.title
33 | }
34 |
35 | var presenter: String {
36 | if let sponsor = session.sponsor {
37 | return sponsor.localizedName
38 | }
39 |
40 | if let speaker = session.presentation?.speaker {
41 | return speaker.localizedName
42 | }
43 |
44 | return dataDefaults.presenter
45 | }
46 |
47 | var imageURL: URL {
48 |
49 | if let speakerImage = session.presentation?.speaker?.imageURL {
50 | return speakerImage
51 | }
52 |
53 | if let imageURL = dataDefaults.customImageAssetURL {
54 | return imageURL
55 | }
56 |
57 | if let event = session.event {
58 | return event.logoURL
59 | }
60 |
61 | return dataDefaults.imageURL
62 | }
63 |
64 | var location: String {
65 | if let event = session.event {
66 | return event.localizedLocation
67 | }
68 |
69 | if let venue = session.venue {
70 | if let displayAddress = venue.displayAddress {
71 | return displayAddress
72 | }
73 | return venue.localizedAddress
74 | }
75 |
76 | return dataDefaults.location
77 | }
78 |
79 | var shortDescription: String {
80 | return "💻".localized()
81 | }
82 |
83 | var longDescription: String {
84 | return dataDefaults.longDescription
85 | }
86 |
87 | var selectable: Bool {
88 | return session.event != nil || session.presentation != nil || session.venue != nil
89 | }
90 |
91 | var twitter: String {
92 | let twitter = session.sponsor?.twitter ?? session.presentation?.speaker?.twitter ?? dataDefaults.twitter
93 | return "@\(twitter)"
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/TrySwiftData/ViewModels/SessionViewModel/SessionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SessionViewModel.swift
3 | // Pods
4 | //
5 | // Created by Natasha Murashev on 3/23/17.
6 | //
7 | //
8 |
9 | public struct SessionViewModel: SessionDisplayable {
10 |
11 | private let displayble: SessionDisplayable
12 |
13 | public init(session: Session) {
14 | switch session.type {
15 | case .workshop:
16 | displayble = WorkshopSessionViewModel(session)!
17 | case .meetup:
18 | displayble = MeetupSessionViewModel(session)!
19 | case .breakfast:
20 | displayble = BreakfastSessionViewModel(session)!
21 | case .announcement:
22 | displayble = AnnouncementSessionViewModel(session)!
23 | case .talk:
24 | displayble = TalkSessionViewModel(session)!
25 | case .lightningTalk:
26 | displayble = LightningTalkSessionViewModel(session)!
27 | case .sponsoredDemo:
28 | displayble = SponsoredDemoSessionViewModel(session)!
29 | case .coffeeBreak:
30 | displayble = CoffeeBreakSessionViewModel(session)!
31 | case .lunch:
32 | displayble = LunchSessionViewModel(session)!
33 | case .officeHours:
34 | displayble = OfficeHoursSessionViewModel(session)!
35 | case .party:
36 | displayble = PartySessionViewModel(session)!
37 | case .registration:
38 | displayble = RegistrationSessionViewModel(session)!
39 | case .panel:
40 | displayble = PanelSessionViewModel(session)!
41 | }
42 | }
43 |
44 | public var title: String { return displayble.title }
45 |
46 | public var presenter: String { return displayble.presenter }
47 |
48 | public var imageURL: URL { return displayble.imageURL }
49 |
50 | public var location: String { return displayble.location }
51 |
52 | public var shortDescription: String { return displayble.shortDescription }
53 |
54 | public var longDescription: String { return displayble.longDescription }
55 |
56 | public var twitter: String { return displayble.twitter }
57 |
58 | public var selectable: Bool { return displayble.selectable }
59 |
60 | }
61 |
--------------------------------------------------------------------------------