├── .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 | [![CI Status](https://img.shields.io/travis/Alvin%20Varghese/trySwiftData.svg?style=flat)](https://travis-ci.org/Alvin%20Varghese/trySwiftData) 4 | [![Version](https://img.shields.io/cocoapods/v/trySwiftData.svg?style=flat)](https://cocoapods.org/pods/trySwiftData) 5 | [![License](https://img.shields.io/cocoapods/l/trySwiftData.svg?style=flat)](https://cocoapods.org/pods/trySwiftData) 6 | [![Platform](https://img.shields.io/cocoapods/p/trySwiftData.svg?style=flat)](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 | --------------------------------------------------------------------------------