From c46dea266490936b2078053f15c642ea45174e94 Mon Sep 17 00:00:00 2001 From: June <31872218+wimara0228@users.noreply.github.com> Date: Sat, 4 Nov 2017 21:09:37 +0900 Subject: [PATCH 1/4] chapter 1 samples --- .../BareBasic.xcodeproj/project.pbxproj | 345 +++++++++++--- .../contents.xcworkspacedata | 7 + .../BareBasic/BareBasic/AppDelegate.swift | 20 +- .../AppIcon.appiconset/Contents.json | 30 ++ .../Base.lproj/LaunchScreen.storyboard | 10 +- .../BareBasic/Base.lproj/Main.storyboard | 38 +- Chapter1/BareBasic/BareBasic/Info.plist | 2 - .../BareBasic/BareBasic/ViewController.swift | 4 +- .../BareBasicTests/BareBasicTests.swift | 36 ++ Chapter1/BareBasic/BareBasicTests/Info.plist | 22 + .../BareBasicUITests/BareBasicUITests.swift | 36 ++ .../BareBasic/BareBasicUITests/Info.plist | 22 + .../contents.xcworkspacedata | 7 + .../HelloiPhoneTests/HelloiPhoneTests.swift | 36 ++ .../HelloiPhone/HelloiPhoneTests/Info.plist | 22 + .../HelloiPhoneUITests.swift | 36 ++ .../HelloiPhone/HelloiPhoneUITests/Info.plist | 22 + .../MeetingRooms.xcodeproj/project.pbxproj | 420 +++++++++++++---- .../contents.xcworkspacedata | 7 + .../MeetingRooms/AppDelegate.swift | 20 +- .../4347286612_11577182f1_o.jpg | Bin 28131 -> 0 bytes .../Contents.json | 21 - .../AppIcon.appiconset/Contents.json | 25 + .../Assets.xcassets/Contents.json | 6 - .../Base.lproj/LaunchScreen.storyboard | 16 +- .../MeetingRooms/Base.lproj/Main.storyboard | 289 ++++++------ .../MeetingRooms/MeetingRooms/Info.plist | 4 +- .../MeetingRooms/ViewController.swift | 4 +- .../MeetingRooms/MeetingRoomsTests/Info.plist | 22 + .../MeetingRoomsTests/MeetingRoomsTests.swift | 36 ++ .../MeetingRoomsUITests/Info.plist | 22 + .../MeetingRoomsUITests.swift | 36 ++ .../MoneyConverter.xcodeproj/project.pbxproj | 427 ++++++++++++++---- .../contents.xcworkspacedata | 7 + .../MoneyConverter/AppDelegate.swift | 27 +- .../AppIcon.appiconset/Contents.json | 25 + .../Base.lproj/LaunchScreen.storyboard | 16 +- .../MoneyConverter/Base.lproj/Main.storyboard | 95 ++-- .../MoneyConverter/MoneyConverter/Info.plist | 4 +- .../MoneyConverter/MoneyConverter/Money.swift | 53 +-- .../MoneyConverter/ViewController.swift | 49 +- .../MoneyConverterTests/Info.plist | 22 + .../MoneyConverterTests.swift | 36 ++ .../MoneyConverterUITests/Info.plist | 22 + .../MoneyConverterUITests.swift | 36 ++ 45 files changed, 1833 insertions(+), 609 deletions(-) create mode 100644 Chapter1/BareBasic/BareBasic.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Chapter1/BareBasic/BareBasicTests/BareBasicTests.swift create mode 100644 Chapter1/BareBasic/BareBasicTests/Info.plist create mode 100644 Chapter1/BareBasic/BareBasicUITests/BareBasicUITests.swift create mode 100644 Chapter1/BareBasic/BareBasicUITests/Info.plist create mode 100644 Chapter1/HelloiPhone/HelloiPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Chapter1/HelloiPhone/HelloiPhoneTests/HelloiPhoneTests.swift create mode 100644 Chapter1/HelloiPhone/HelloiPhoneTests/Info.plist create mode 100644 Chapter1/HelloiPhone/HelloiPhoneUITests/HelloiPhoneUITests.swift create mode 100644 Chapter1/HelloiPhone/HelloiPhoneUITests/Info.plist create mode 100644 SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 SampleCodes/MeetingRooms/MeetingRooms/Assets.xcassets/4347286612_11577182f1_o.imageset/4347286612_11577182f1_o.jpg delete mode 100644 SampleCodes/MeetingRooms/MeetingRooms/Assets.xcassets/4347286612_11577182f1_o.imageset/Contents.json delete mode 100644 SampleCodes/MeetingRooms/MeetingRooms/Assets.xcassets/Contents.json create mode 100644 SampleCodes/MeetingRooms/MeetingRoomsTests/Info.plist create mode 100644 SampleCodes/MeetingRooms/MeetingRoomsTests/MeetingRoomsTests.swift create mode 100644 SampleCodes/MeetingRooms/MeetingRoomsUITests/Info.plist create mode 100644 SampleCodes/MeetingRooms/MeetingRoomsUITests/MeetingRoomsUITests.swift create mode 100644 SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SampleCodes/MoneyConverter/MoneyConverterTests/Info.plist create mode 100644 SampleCodes/MoneyConverter/MoneyConverterTests/MoneyConverterTests.swift create mode 100644 SampleCodes/MoneyConverter/MoneyConverterUITests/Info.plist create mode 100644 SampleCodes/MoneyConverter/MoneyConverterUITests/MoneyConverterUITests.swift diff --git a/Chapter1/BareBasic/BareBasic.xcodeproj/project.pbxproj b/Chapter1/BareBasic/BareBasic.xcodeproj/project.pbxproj index 5e4919c..03bbaea 100644 --- a/Chapter1/BareBasic/BareBasic.xcodeproj/project.pbxproj +++ b/Chapter1/BareBasic/BareBasic.xcodeproj/project.pbxproj @@ -7,25 +7,58 @@ objects = { /* Begin PBXBuildFile section */ - 2C7582891BE0A4B600BE59B3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C7582881BE0A4B600BE59B3 /* AppDelegate.swift */; }; - 2C75828B1BE0A4B600BE59B3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C75828A1BE0A4B600BE59B3 /* ViewController.swift */; }; - 2C75828E1BE0A4B600BE59B3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C75828C1BE0A4B600BE59B3 /* Main.storyboard */; }; - 2C7582901BE0A4B600BE59B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2C75828F1BE0A4B600BE59B3 /* Assets.xcassets */; }; - 2C7582931BE0A4B600BE59B3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C7582911BE0A4B600BE59B3 /* LaunchScreen.storyboard */; }; + 047F9B3D1F6961C600E637ED /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047F9B3C1F6961C600E637ED /* AppDelegate.swift */; }; + 047F9B3F1F6961C600E637ED /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047F9B3E1F6961C600E637ED /* ViewController.swift */; }; + 047F9B421F6961C600E637ED /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047F9B401F6961C600E637ED /* Main.storyboard */; }; + 047F9B441F6961C600E637ED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 047F9B431F6961C600E637ED /* Assets.xcassets */; }; + 047F9B471F6961C600E637ED /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047F9B451F6961C600E637ED /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 047F9B4E1F6961C600E637ED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047F9B311F6961C600E637ED /* Project object */; + proxyType = 1; + remoteGlobalIDString = 047F9B381F6961C600E637ED; + remoteInfo = BareBasic; + }; + 047F9B591F6961C600E637ED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047F9B311F6961C600E637ED /* Project object */; + proxyType = 1; + remoteGlobalIDString = 047F9B381F6961C600E637ED; + remoteInfo = BareBasic; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ - 2C7582851BE0A4B600BE59B3 /* BareBasic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BareBasic.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2C7582881BE0A4B600BE59B3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 2C75828A1BE0A4B600BE59B3 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 2C75828D1BE0A4B600BE59B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 2C75828F1BE0A4B600BE59B3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2C7582921BE0A4B600BE59B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 2C7582941BE0A4B600BE59B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 047F9B391F6961C600E637ED /* BareBasic */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = BareBasic; path = "../../../../../../../../iOS-Swift-Basics_helloworld/Chapter1/BareBasic/BareBasic"; sourceTree = BUILT_PRODUCTS_DIR; }; + 047F9B3C1F6961C600E637ED /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 047F9B3E1F6961C600E637ED /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 047F9B411F6961C600E637ED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 047F9B431F6961C600E637ED /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 047F9B461F6961C600E637ED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 047F9B481F6961C600E637ED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 047F9B4D1F6961C600E637ED /* BareBasicTests */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = BareBasicTests; path = "../../../../../../../../iOS-Swift-Basics_helloworld/Chapter1/BareBasic/BareBasicTests"; sourceTree = BUILT_PRODUCTS_DIR; }; + 047F9B581F6961C600E637ED /* BareBasicUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = BareBasicUITests; path = "../../../../../../../../iOS-Swift-Basics_helloworld/Chapter1/BareBasic/BareBasicUITests"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2C7582821BE0A4B600BE59B3 /* Frameworks */ = { + 047F9B361F6961C600E637ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B4A1F6961C600E637ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B551F6961C600E637ED /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -35,31 +68,33 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C75827C1BE0A4B600BE59B3 = { + 047F9B301F6961C600E637ED = { isa = PBXGroup; children = ( - 2C7582871BE0A4B600BE59B3 /* BareBasic */, - 2C7582861BE0A4B600BE59B3 /* Products */, + 047F9B3B1F6961C600E637ED /* BareBasic */, + 047F9B3A1F6961C600E637ED /* Products */, ); sourceTree = ""; }; - 2C7582861BE0A4B600BE59B3 /* Products */ = { + 047F9B3A1F6961C600E637ED /* Products */ = { isa = PBXGroup; children = ( - 2C7582851BE0A4B600BE59B3 /* BareBasic.app */, + 047F9B391F6961C600E637ED /* BareBasic */, + 047F9B4D1F6961C600E637ED /* BareBasicTests */, + 047F9B581F6961C600E637ED /* BareBasicUITests */, ); name = Products; sourceTree = ""; }; - 2C7582871BE0A4B600BE59B3 /* BareBasic */ = { + 047F9B3B1F6961C600E637ED /* BareBasic */ = { isa = PBXGroup; children = ( - 2C7582881BE0A4B600BE59B3 /* AppDelegate.swift */, - 2C75828A1BE0A4B600BE59B3 /* ViewController.swift */, - 2C75828C1BE0A4B600BE59B3 /* Main.storyboard */, - 2C75828F1BE0A4B600BE59B3 /* Assets.xcassets */, - 2C7582911BE0A4B600BE59B3 /* LaunchScreen.storyboard */, - 2C7582941BE0A4B600BE59B3 /* Info.plist */, + 047F9B3C1F6961C600E637ED /* AppDelegate.swift */, + 047F9B3E1F6961C600E637ED /* ViewController.swift */, + 047F9B401F6961C600E637ED /* Main.storyboard */, + 047F9B431F6961C600E637ED /* Assets.xcassets */, + 047F9B451F6961C600E637ED /* LaunchScreen.storyboard */, + 047F9B481F6961C600E637ED /* Info.plist */, ); path = BareBasic; sourceTree = ""; @@ -67,13 +102,13 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2C7582841BE0A4B600BE59B3 /* BareBasic */ = { + 047F9B381F6961C600E637ED /* BareBasic */ = { isa = PBXNativeTarget; - buildConfigurationList = 2C7582971BE0A4B600BE59B3 /* Build configuration list for PBXNativeTarget "BareBasic" */; + buildConfigurationList = 047F9B611F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasic" */; buildPhases = ( - 2C7582811BE0A4B600BE59B3 /* Sources */, - 2C7582821BE0A4B600BE59B3 /* Frameworks */, - 2C7582831BE0A4B600BE59B3 /* Resources */, + 047F9B351F6961C600E637ED /* Sources */, + 047F9B361F6961C600E637ED /* Frameworks */, + 047F9B371F6961C600E637ED /* Resources */, ); buildRules = ( ); @@ -81,24 +116,72 @@ ); name = BareBasic; productName = BareBasic; - productReference = 2C7582851BE0A4B600BE59B3 /* BareBasic.app */; + productReference = 047F9B391F6961C600E637ED /* BareBasic */; productType = "com.apple.product-type.application"; }; + 047F9B4C1F6961C600E637ED /* BareBasicTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 047F9B641F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasicTests" */; + buildPhases = ( + 047F9B491F6961C600E637ED /* Sources */, + 047F9B4A1F6961C600E637ED /* Frameworks */, + 047F9B4B1F6961C600E637ED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 047F9B4F1F6961C600E637ED /* PBXTargetDependency */, + ); + name = BareBasicTests; + productName = BareBasicTests; + productReference = 047F9B4D1F6961C600E637ED /* BareBasicTests */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 047F9B571F6961C600E637ED /* BareBasicUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 047F9B671F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasicUITests" */; + buildPhases = ( + 047F9B541F6961C600E637ED /* Sources */, + 047F9B551F6961C600E637ED /* Frameworks */, + 047F9B561F6961C600E637ED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 047F9B5A1F6961C600E637ED /* PBXTargetDependency */, + ); + name = BareBasicUITests; + productName = BareBasicUITests; + productReference = 047F9B581F6961C600E637ED /* BareBasicUITests */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2C75827D1BE0A4B600BE59B3 /* Project object */ = { + 047F9B311F6961C600E637ED /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = CodersHigh; + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Mac; TargetAttributes = { - 2C7582841BE0A4B600BE59B3 = { - CreatedOnToolsVersion = 7.0.1; + 047F9B381F6961C600E637ED = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + 047F9B4C1F6961C600E637ED = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + TestTargetID = 047F9B381F6961C600E637ED; + }; + 047F9B571F6961C600E637ED = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + TestTargetID = 047F9B381F6961C600E637ED; }; }; }; - buildConfigurationList = 2C7582801BE0A4B600BE59B3 /* Build configuration list for PBXProject "BareBasic" */; + buildConfigurationList = 047F9B341F6961C600E637ED /* Build configuration list for PBXProject "BareBasic" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -106,54 +189,97 @@ en, Base, ); - mainGroup = 2C75827C1BE0A4B600BE59B3; - productRefGroup = 2C7582861BE0A4B600BE59B3 /* Products */; + mainGroup = 047F9B301F6961C600E637ED; + productRefGroup = 047F9B3A1F6961C600E637ED /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 2C7582841BE0A4B600BE59B3 /* BareBasic */, + 047F9B381F6961C600E637ED /* BareBasic */, + 047F9B4C1F6961C600E637ED /* BareBasicTests */, + 047F9B571F6961C600E637ED /* BareBasicUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2C7582831BE0A4B600BE59B3 /* Resources */ = { + 047F9B371F6961C600E637ED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 047F9B471F6961C600E637ED /* LaunchScreen.storyboard in Resources */, + 047F9B441F6961C600E637ED /* Assets.xcassets in Resources */, + 047F9B421F6961C600E637ED /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B4B1F6961C600E637ED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B561F6961C600E637ED /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C7582931BE0A4B600BE59B3 /* LaunchScreen.storyboard in Resources */, - 2C7582901BE0A4B600BE59B3 /* Assets.xcassets in Resources */, - 2C75828E1BE0A4B600BE59B3 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2C7582811BE0A4B600BE59B3 /* Sources */ = { + 047F9B351F6961C600E637ED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 047F9B3F1F6961C600E637ED /* ViewController.swift in Sources */, + 047F9B3D1F6961C600E637ED /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B491F6961C600E637ED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047F9B541F6961C600E637ED /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C75828B1BE0A4B600BE59B3 /* ViewController.swift in Sources */, - 2C7582891BE0A4B600BE59B3 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 047F9B4F1F6961C600E637ED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 047F9B381F6961C600E637ED /* BareBasic */; + targetProxy = 047F9B4E1F6961C600E637ED /* PBXContainerItemProxy */; + }; + 047F9B5A1F6961C600E637ED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 047F9B381F6961C600E637ED /* BareBasic */; + targetProxy = 047F9B591F6961C600E637ED /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ - 2C75828C1BE0A4B600BE59B3 /* Main.storyboard */ = { + 047F9B401F6961C600E637ED /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C75828D1BE0A4B600BE59B3 /* Base */, + 047F9B411F6961C600E637ED /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 2C7582911BE0A4B600BE59B3 /* LaunchScreen.storyboard */ = { + 047F9B451F6961C600E637ED /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C7582921BE0A4B600BE59B3 /* Base */, + 047F9B461F6961C600E637ED /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -161,10 +287,12 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 2C7582951BE0A4B600BE59B3 /* Debug */ = { + 047F9B5F1F6961C600E637ED /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -172,10 +300,13 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -197,19 +328,22 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 2C7582961BE0A4B600BE59B3 /* Release */ = { + 047F9B601F6961C600E637ED /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -217,10 +351,13 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -236,57 +373,133 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 2C7582981BE0A4B600BE59B3 /* Debug */ = { + 047F9B621F6961C600E637ED /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = BareBasic/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.BareBasic; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasic; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; - 2C7582991BE0A4B600BE59B3 /* Release */ = { + 047F9B631F6961C600E637ED /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = BareBasic/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.BareBasic; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 047F9B651F6961C600E637ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = BareBasicTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasicTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BareBasic.app/BareBasic"; + }; + name = Debug; + }; + 047F9B661F6961C600E637ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = BareBasicTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasicTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BareBasic.app/BareBasic"; + }; + name = Release; + }; + 047F9B681F6961C600E637ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = BareBasicUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasicUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_TARGET_NAME = BareBasic; + }; + name = Debug; + }; + 047F9B691F6961C600E637ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = BareBasicUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = pakpam.BareBasicUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_TARGET_NAME = BareBasic; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2C7582801BE0A4B600BE59B3 /* Build configuration list for PBXProject "BareBasic" */ = { + 047F9B341F6961C600E637ED /* Build configuration list for PBXProject "BareBasic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 047F9B5F1F6961C600E637ED /* Debug */, + 047F9B601F6961C600E637ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 047F9B611F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 047F9B621F6961C600E637ED /* Debug */, + 047F9B631F6961C600E637ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 047F9B641F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasicTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C7582951BE0A4B600BE59B3 /* Debug */, - 2C7582961BE0A4B600BE59B3 /* Release */, + 047F9B651F6961C600E637ED /* Debug */, + 047F9B661F6961C600E637ED /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2C7582971BE0A4B600BE59B3 /* Build configuration list for PBXNativeTarget "BareBasic" */ = { + 047F9B671F6961C600E637ED /* Build configuration list for PBXNativeTarget "BareBasicUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C7582981BE0A4B600BE59B3 /* Debug */, - 2C7582991BE0A4B600BE59B3 /* Release */, + 047F9B681F6961C600E637ED /* Debug */, + 047F9B691F6961C600E637ED /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 2C75827D1BE0A4B600BE59B3 /* Project object */; + rootObject = 047F9B311F6961C600E637ED /* Project object */; } diff --git a/Chapter1/BareBasic/BareBasic.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Chapter1/BareBasic/BareBasic.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a2f94f8 --- /dev/null +++ b/Chapter1/BareBasic/BareBasic.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Chapter1/BareBasic/BareBasic/AppDelegate.swift b/Chapter1/BareBasic/BareBasic/AppDelegate.swift index 7275f38..09b1f78 100644 --- a/Chapter1/BareBasic/BareBasic/AppDelegate.swift +++ b/Chapter1/BareBasic/BareBasic/AppDelegate.swift @@ -2,8 +2,8 @@ // AppDelegate.swift // BareBasic // -// Created by Lingostar on 2015. 10. 28.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit @@ -14,30 +14,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/Chapter1/BareBasic/BareBasic/Assets.xcassets/AppIcon.appiconset/Contents.json b/Chapter1/BareBasic/BareBasic/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..d8db8d6 100644 --- a/Chapter1/BareBasic/BareBasic/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Chapter1/BareBasic/BareBasic/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,16 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Chapter1/BareBasic/BareBasic/Base.lproj/LaunchScreen.storyboard b/Chapter1/BareBasic/BareBasic/Base.lproj/LaunchScreen.storyboard index 2e721e1..fdf3f97 100644 --- a/Chapter1/BareBasic/BareBasic/Base.lproj/LaunchScreen.storyboard +++ b/Chapter1/BareBasic/BareBasic/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -13,10 +14,9 @@ - + - - + diff --git a/Chapter1/BareBasic/BareBasic/Base.lproj/Main.storyboard b/Chapter1/BareBasic/BareBasic/Base.lproj/Main.storyboard index 090b02d..46ed535 100644 --- a/Chapter1/BareBasic/BareBasic/Base.lproj/Main.storyboard +++ b/Chapter1/BareBasic/BareBasic/Base.lproj/Main.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -13,29 +18,30 @@ - + - - - - + + + + - - - + - + diff --git a/Chapter1/BareBasic/BareBasic/Info.plist b/Chapter1/BareBasic/BareBasic/Info.plist index 40c6215..d052473 100644 --- a/Chapter1/BareBasic/BareBasic/Info.plist +++ b/Chapter1/BareBasic/BareBasic/Info.plist @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/Chapter1/BareBasic/BareBasic/ViewController.swift b/Chapter1/BareBasic/BareBasic/ViewController.swift index 236ec97..1cf3ba7 100644 --- a/Chapter1/BareBasic/BareBasic/ViewController.swift +++ b/Chapter1/BareBasic/BareBasic/ViewController.swift @@ -2,8 +2,8 @@ // ViewController.swift // BareBasic // -// Created by Lingostar on 2015. 10. 28.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit diff --git a/Chapter1/BareBasic/BareBasicTests/BareBasicTests.swift b/Chapter1/BareBasic/BareBasicTests/BareBasicTests.swift new file mode 100644 index 0000000..f8e001d --- /dev/null +++ b/Chapter1/BareBasic/BareBasicTests/BareBasicTests.swift @@ -0,0 +1,36 @@ +// +// BareBasicTests.swift +// BareBasicTests +// +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest +@testable import BareBasic + +class BareBasicTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Chapter1/BareBasic/BareBasicTests/Info.plist b/Chapter1/BareBasic/BareBasicTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Chapter1/BareBasic/BareBasicTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Chapter1/BareBasic/BareBasicUITests/BareBasicUITests.swift b/Chapter1/BareBasic/BareBasicUITests/BareBasicUITests.swift new file mode 100644 index 0000000..b5ba9b8 --- /dev/null +++ b/Chapter1/BareBasic/BareBasicUITests/BareBasicUITests.swift @@ -0,0 +1,36 @@ +// +// BareBasicUITests.swift +// BareBasicUITests +// +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest + +class BareBasicUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Chapter1/BareBasic/BareBasicUITests/Info.plist b/Chapter1/BareBasic/BareBasicUITests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Chapter1/BareBasic/BareBasicUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Chapter1/HelloiPhone/HelloiPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Chapter1/HelloiPhone/HelloiPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ca797d8 --- /dev/null +++ b/Chapter1/HelloiPhone/HelloiPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Chapter1/HelloiPhone/HelloiPhoneTests/HelloiPhoneTests.swift b/Chapter1/HelloiPhone/HelloiPhoneTests/HelloiPhoneTests.swift new file mode 100644 index 0000000..2eb8cb0 --- /dev/null +++ b/Chapter1/HelloiPhone/HelloiPhoneTests/HelloiPhoneTests.swift @@ -0,0 +1,36 @@ +// +// HelloiPhoneTests.swift +// HelloiPhoneTests +// +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest +@testable import HelloiPhone + +class HelloiPhoneTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Chapter1/HelloiPhone/HelloiPhoneTests/Info.plist b/Chapter1/HelloiPhone/HelloiPhoneTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Chapter1/HelloiPhone/HelloiPhoneTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Chapter1/HelloiPhone/HelloiPhoneUITests/HelloiPhoneUITests.swift b/Chapter1/HelloiPhone/HelloiPhoneUITests/HelloiPhoneUITests.swift new file mode 100644 index 0000000..0b41d14 --- /dev/null +++ b/Chapter1/HelloiPhone/HelloiPhoneUITests/HelloiPhoneUITests.swift @@ -0,0 +1,36 @@ +// +// HelloiPhoneUITests.swift +// HelloiPhoneUITests +// +// Created by Mac on 2017. 9. 13.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest + +class HelloiPhoneUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Chapter1/HelloiPhone/HelloiPhoneUITests/Info.plist b/Chapter1/HelloiPhone/HelloiPhoneUITests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Chapter1/HelloiPhone/HelloiPhoneUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.pbxproj b/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.pbxproj index 59c41e5..8ad412c 100644 --- a/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.pbxproj +++ b/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.pbxproj @@ -3,29 +3,68 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 48; objects = { /* Begin PBXBuildFile section */ - 2C6EF0961C2AB6D8002398BD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6EF0951C2AB6D8002398BD /* AppDelegate.swift */; }; - 2C6EF0981C2AB6D8002398BD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6EF0971C2AB6D8002398BD /* ViewController.swift */; }; - 2C6EF09B1C2AB6D8002398BD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C6EF0991C2AB6D8002398BD /* Main.storyboard */; }; - 2C6EF09D1C2AB6D8002398BD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2C6EF09C1C2AB6D8002398BD /* Assets.xcassets */; }; - 2C6EF0A01C2AB6D8002398BD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C6EF09E1C2AB6D8002398BD /* LaunchScreen.storyboard */; }; + 04BDBD2E1F825DD9004CC97E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD2D1F825DD9004CC97E /* AppDelegate.swift */; }; + 04BDBD301F825DD9004CC97E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD2F1F825DD9004CC97E /* ViewController.swift */; }; + 04BDBD331F825DD9004CC97E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBD311F825DD9004CC97E /* Main.storyboard */; }; + 04BDBD351F825DD9004CC97E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBD341F825DD9004CC97E /* Assets.xcassets */; }; + 04BDBD381F825DD9004CC97E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBD361F825DD9004CC97E /* LaunchScreen.storyboard */; }; + 04BDBD431F825DD9004CC97E /* MeetingRoomsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD421F825DD9004CC97E /* MeetingRoomsTests.swift */; }; + 04BDBD4E1F825DD9004CC97E /* MeetingRoomsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD4D1F825DD9004CC97E /* MeetingRoomsUITests.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 04BDBD3F1F825DD9004CC97E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04BDBD221F825DD9004CC97E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04BDBD291F825DD9004CC97E; + remoteInfo = MeetingRooms; + }; + 04BDBD4A1F825DD9004CC97E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04BDBD221F825DD9004CC97E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04BDBD291F825DD9004CC97E; + remoteInfo = MeetingRooms; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ - 2C6EF0921C2AB6D7002398BD /* MeetingRooms.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeetingRooms.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2C6EF0951C2AB6D8002398BD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 2C6EF0971C2AB6D8002398BD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 2C6EF09A1C2AB6D8002398BD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 2C6EF09C1C2AB6D8002398BD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2C6EF09F1C2AB6D8002398BD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 2C6EF0A11C2AB6D8002398BD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD2A1F825DD9004CC97E /* MeetingRooms.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeetingRooms.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBD2D1F825DD9004CC97E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 04BDBD2F1F825DD9004CC97E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 04BDBD321F825DD9004CC97E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 04BDBD341F825DD9004CC97E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 04BDBD371F825DD9004CC97E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 04BDBD391F825DD9004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD3E1F825DD9004CC97E /* MeetingRoomsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeetingRoomsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBD421F825DD9004CC97E /* MeetingRoomsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingRoomsTests.swift; sourceTree = ""; }; + 04BDBD441F825DD9004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD491F825DD9004CC97E /* MeetingRoomsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeetingRoomsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBD4D1F825DD9004CC97E /* MeetingRoomsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingRoomsUITests.swift; sourceTree = ""; }; + 04BDBD4F1F825DD9004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2C6EF08F1C2AB6D7002398BD /* Frameworks */ = { + 04BDBD271F825DD9004CC97E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD3B1F825DD9004CC97E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD461F825DD9004CC97E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -35,45 +74,67 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C6EF0891C2AB6D7002398BD = { + 04BDBD211F825DD9004CC97E = { isa = PBXGroup; children = ( - 2C6EF0941C2AB6D7002398BD /* MeetingRooms */, - 2C6EF0931C2AB6D7002398BD /* Products */, + 04BDBD2C1F825DD9004CC97E /* MeetingRooms */, + 04BDBD411F825DD9004CC97E /* MeetingRoomsTests */, + 04BDBD4C1F825DD9004CC97E /* MeetingRoomsUITests */, + 04BDBD2B1F825DD9004CC97E /* Products */, ); sourceTree = ""; }; - 2C6EF0931C2AB6D7002398BD /* Products */ = { + 04BDBD2B1F825DD9004CC97E /* Products */ = { isa = PBXGroup; children = ( - 2C6EF0921C2AB6D7002398BD /* MeetingRooms.app */, + 04BDBD2A1F825DD9004CC97E /* MeetingRooms.app */, + 04BDBD3E1F825DD9004CC97E /* MeetingRoomsTests.xctest */, + 04BDBD491F825DD9004CC97E /* MeetingRoomsUITests.xctest */, ); name = Products; sourceTree = ""; }; - 2C6EF0941C2AB6D7002398BD /* MeetingRooms */ = { + 04BDBD2C1F825DD9004CC97E /* MeetingRooms */ = { isa = PBXGroup; children = ( - 2C6EF0951C2AB6D8002398BD /* AppDelegate.swift */, - 2C6EF0971C2AB6D8002398BD /* ViewController.swift */, - 2C6EF0991C2AB6D8002398BD /* Main.storyboard */, - 2C6EF09C1C2AB6D8002398BD /* Assets.xcassets */, - 2C6EF09E1C2AB6D8002398BD /* LaunchScreen.storyboard */, - 2C6EF0A11C2AB6D8002398BD /* Info.plist */, + 04BDBD2D1F825DD9004CC97E /* AppDelegate.swift */, + 04BDBD2F1F825DD9004CC97E /* ViewController.swift */, + 04BDBD311F825DD9004CC97E /* Main.storyboard */, + 04BDBD341F825DD9004CC97E /* Assets.xcassets */, + 04BDBD361F825DD9004CC97E /* LaunchScreen.storyboard */, + 04BDBD391F825DD9004CC97E /* Info.plist */, ); path = MeetingRooms; sourceTree = ""; }; + 04BDBD411F825DD9004CC97E /* MeetingRoomsTests */ = { + isa = PBXGroup; + children = ( + 04BDBD421F825DD9004CC97E /* MeetingRoomsTests.swift */, + 04BDBD441F825DD9004CC97E /* Info.plist */, + ); + path = MeetingRoomsTests; + sourceTree = ""; + }; + 04BDBD4C1F825DD9004CC97E /* MeetingRoomsUITests */ = { + isa = PBXGroup; + children = ( + 04BDBD4D1F825DD9004CC97E /* MeetingRoomsUITests.swift */, + 04BDBD4F1F825DD9004CC97E /* Info.plist */, + ); + path = MeetingRoomsUITests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2C6EF0911C2AB6D7002398BD /* MeetingRooms */ = { + 04BDBD291F825DD9004CC97E /* MeetingRooms */ = { isa = PBXNativeTarget; - buildConfigurationList = 2C6EF0A41C2AB6D8002398BD /* Build configuration list for PBXNativeTarget "MeetingRooms" */; + buildConfigurationList = 04BDBD521F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRooms" */; buildPhases = ( - 2C6EF08E1C2AB6D7002398BD /* Sources */, - 2C6EF08F1C2AB6D7002398BD /* Frameworks */, - 2C6EF0901C2AB6D7002398BD /* Resources */, + 04BDBD261F825DD9004CC97E /* Sources */, + 04BDBD271F825DD9004CC97E /* Frameworks */, + 04BDBD281F825DD9004CC97E /* Resources */, ); buildRules = ( ); @@ -81,80 +142,172 @@ ); name = MeetingRooms; productName = MeetingRooms; - productReference = 2C6EF0921C2AB6D7002398BD /* MeetingRooms.app */; + productReference = 04BDBD2A1F825DD9004CC97E /* MeetingRooms.app */; productType = "com.apple.product-type.application"; }; + 04BDBD3D1F825DD9004CC97E /* MeetingRoomsTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04BDBD551F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRoomsTests" */; + buildPhases = ( + 04BDBD3A1F825DD9004CC97E /* Sources */, + 04BDBD3B1F825DD9004CC97E /* Frameworks */, + 04BDBD3C1F825DD9004CC97E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04BDBD401F825DD9004CC97E /* PBXTargetDependency */, + ); + name = MeetingRoomsTests; + productName = MeetingRoomsTests; + productReference = 04BDBD3E1F825DD9004CC97E /* MeetingRoomsTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 04BDBD481F825DD9004CC97E /* MeetingRoomsUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04BDBD581F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRoomsUITests" */; + buildPhases = ( + 04BDBD451F825DD9004CC97E /* Sources */, + 04BDBD461F825DD9004CC97E /* Frameworks */, + 04BDBD471F825DD9004CC97E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04BDBD4B1F825DD9004CC97E /* PBXTargetDependency */, + ); + name = MeetingRoomsUITests; + productName = MeetingRoomsUITests; + productReference = 04BDBD491F825DD9004CC97E /* MeetingRoomsUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2C6EF08A1C2AB6D7002398BD /* Project object */ = { + 04BDBD221F825DD9004CC97E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = CodersHigh; + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = Mac; TargetAttributes = { - 2C6EF0911C2AB6D7002398BD = { - CreatedOnToolsVersion = 7.1; + 04BDBD291F825DD9004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + 04BDBD3D1F825DD9004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 04BDBD291F825DD9004CC97E; + }; + 04BDBD481F825DD9004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 04BDBD291F825DD9004CC97E; }; }; }; - buildConfigurationList = 2C6EF08D1C2AB6D7002398BD /* Build configuration list for PBXProject "MeetingRooms" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + buildConfigurationList = 04BDBD251F825DD9004CC97E /* Build configuration list for PBXProject "MeetingRooms" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 2C6EF0891C2AB6D7002398BD; - productRefGroup = 2C6EF0931C2AB6D7002398BD /* Products */; + mainGroup = 04BDBD211F825DD9004CC97E; + productRefGroup = 04BDBD2B1F825DD9004CC97E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 2C6EF0911C2AB6D7002398BD /* MeetingRooms */, + 04BDBD291F825DD9004CC97E /* MeetingRooms */, + 04BDBD3D1F825DD9004CC97E /* MeetingRoomsTests */, + 04BDBD481F825DD9004CC97E /* MeetingRoomsUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2C6EF0901C2AB6D7002398BD /* Resources */ = { + 04BDBD281F825DD9004CC97E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBD381F825DD9004CC97E /* LaunchScreen.storyboard in Resources */, + 04BDBD351F825DD9004CC97E /* Assets.xcassets in Resources */, + 04BDBD331F825DD9004CC97E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD3C1F825DD9004CC97E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD471F825DD9004CC97E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C6EF0A01C2AB6D8002398BD /* LaunchScreen.storyboard in Resources */, - 2C6EF09D1C2AB6D8002398BD /* Assets.xcassets in Resources */, - 2C6EF09B1C2AB6D8002398BD /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2C6EF08E1C2AB6D7002398BD /* Sources */ = { + 04BDBD261F825DD9004CC97E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C6EF0981C2AB6D8002398BD /* ViewController.swift in Sources */, - 2C6EF0961C2AB6D8002398BD /* AppDelegate.swift in Sources */, + 04BDBD301F825DD9004CC97E /* ViewController.swift in Sources */, + 04BDBD2E1F825DD9004CC97E /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD3A1F825DD9004CC97E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBD431F825DD9004CC97E /* MeetingRoomsTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD451F825DD9004CC97E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBD4E1F825DD9004CC97E /* MeetingRoomsUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 04BDBD401F825DD9004CC97E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04BDBD291F825DD9004CC97E /* MeetingRooms */; + targetProxy = 04BDBD3F1F825DD9004CC97E /* PBXContainerItemProxy */; + }; + 04BDBD4B1F825DD9004CC97E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04BDBD291F825DD9004CC97E /* MeetingRooms */; + targetProxy = 04BDBD4A1F825DD9004CC97E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ - 2C6EF0991C2AB6D8002398BD /* Main.storyboard */ = { + 04BDBD311F825DD9004CC97E /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C6EF09A1C2AB6D8002398BD /* Base */, + 04BDBD321F825DD9004CC97E /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 2C6EF09E1C2AB6D8002398BD /* LaunchScreen.storyboard */ = { + 04BDBD361F825DD9004CC97E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C6EF09F1C2AB6D8002398BD /* Base */, + 04BDBD371F825DD9004CC97E /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -162,29 +315,41 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 2C6EF0A21C2AB6D8002398BD /* Debug */ = { + 04BDBD501F825DD9004CC97E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -198,38 +363,50 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 2C6EF0A31C2AB6D8002398BD /* Release */ = { + 04BDBD511F825DD9004CC97E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -237,57 +414,144 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 2C6EF0A51C2AB6D8002398BD /* Debug */ = { + 04BDBD531F825DD9004CC97E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = MeetingRooms/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MeetingRooms; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRooms; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 2C6EF0A61C2AB6D8002398BD /* Release */ = { + 04BDBD541F825DD9004CC97E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = MeetingRooms/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MeetingRooms; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRooms; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 04BDBD561F825DD9004CC97E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRoomsTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRoomsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MeetingRooms.app/MeetingRooms"; + }; + name = Debug; + }; + 04BDBD571F825DD9004CC97E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRoomsTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRoomsTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MeetingRooms.app/MeetingRooms"; + }; + name = Release; + }; + 04BDBD591F825DD9004CC97E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRoomsUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRoomsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MeetingRooms; + }; + name = Debug; + }; + 04BDBD5A1F825DD9004CC97E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRoomsUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MeetingRoomsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MeetingRooms; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2C6EF08D1C2AB6D7002398BD /* Build configuration list for PBXProject "MeetingRooms" */ = { + 04BDBD251F825DD9004CC97E /* Build configuration list for PBXProject "MeetingRooms" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04BDBD501F825DD9004CC97E /* Debug */, + 04BDBD511F825DD9004CC97E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04BDBD521F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRooms" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C6EF0A21C2AB6D8002398BD /* Debug */, - 2C6EF0A31C2AB6D8002398BD /* Release */, + 04BDBD531F825DD9004CC97E /* Debug */, + 04BDBD541F825DD9004CC97E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2C6EF0A41C2AB6D8002398BD /* Build configuration list for PBXNativeTarget "MeetingRooms" */ = { + 04BDBD551F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRoomsTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C6EF0A51C2AB6D8002398BD /* Debug */, - 2C6EF0A61C2AB6D8002398BD /* Release */, + 04BDBD561F825DD9004CC97E /* Debug */, + 04BDBD571F825DD9004CC97E /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04BDBD581F825DD9004CC97E /* Build configuration list for PBXNativeTarget "MeetingRoomsUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04BDBD591F825DD9004CC97E /* Debug */, + 04BDBD5A1F825DD9004CC97E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 2C6EF08A1C2AB6D7002398BD /* Project object */; + rootObject = 04BDBD221F825DD9004CC97E /* Project object */; } diff --git a/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ff41f19 --- /dev/null +++ b/SampleCodes/MeetingRooms/MeetingRooms.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SampleCodes/MeetingRooms/MeetingRooms/AppDelegate.swift b/SampleCodes/MeetingRooms/MeetingRooms/AppDelegate.swift index 22c3a0d..ff8f02d 100644 --- a/SampleCodes/MeetingRooms/MeetingRooms/AppDelegate.swift +++ b/SampleCodes/MeetingRooms/MeetingRooms/AppDelegate.swift @@ -2,8 +2,8 @@ // AppDelegate.swift // MeetingRooms // -// Created by Lingostar on 2015. 12. 23.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit @@ -14,30 +14,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/SampleCodes/MeetingRooms/MeetingRooms/Assets.xcassets/4347286612_11577182f1_o.imageset/4347286612_11577182f1_o.jpg b/SampleCodes/MeetingRooms/MeetingRooms/Assets.xcassets/4347286612_11577182f1_o.imageset/4347286612_11577182f1_o.jpg deleted file mode 100644 index 829e21b43c12bacd242d4d95386725135c24dc15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28131 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 Zx3Hp$XqHKHeK*Rv - + - + + + - - - - - + - - + + diff --git a/SampleCodes/MeetingRooms/MeetingRooms/Base.lproj/Main.storyboard b/SampleCodes/MeetingRooms/MeetingRooms/Base.lproj/Main.storyboard index eae1517..5cdbda7 100644 --- a/SampleCodes/MeetingRooms/MeetingRooms/Base.lproj/Main.storyboard +++ b/SampleCodes/MeetingRooms/MeetingRooms/Base.lproj/Main.storyboard @@ -1,267 +1,236 @@ - - + + + + + - - + + - + - - - + + + - - - + + - - - + - - + + - - - + - + - - + + - - + + - - - - - + + - - + + - - - - - + + - - + + - - - - - + + - - + + - - - - + - - + + - - + + - - - - - + + - - + + - - - - - + + - - + + - - - - - + + - - - - + - + diff --git a/SampleCodes/MeetingRooms/MeetingRooms/Info.plist b/SampleCodes/MeetingRooms/MeetingRooms/Info.plist index 40c6215..16be3b6 100644 --- a/SampleCodes/MeetingRooms/MeetingRooms/Info.plist +++ b/SampleCodes/MeetingRooms/MeetingRooms/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/SampleCodes/MeetingRooms/MeetingRooms/ViewController.swift b/SampleCodes/MeetingRooms/MeetingRooms/ViewController.swift index 435714c..08ac764 100644 --- a/SampleCodes/MeetingRooms/MeetingRooms/ViewController.swift +++ b/SampleCodes/MeetingRooms/MeetingRooms/ViewController.swift @@ -2,8 +2,8 @@ // ViewController.swift // MeetingRooms // -// Created by Lingostar on 2015. 12. 23.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit diff --git a/SampleCodes/MeetingRooms/MeetingRoomsTests/Info.plist b/SampleCodes/MeetingRooms/MeetingRoomsTests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MeetingRooms/MeetingRoomsTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MeetingRooms/MeetingRoomsTests/MeetingRoomsTests.swift b/SampleCodes/MeetingRooms/MeetingRoomsTests/MeetingRoomsTests.swift new file mode 100644 index 0000000..856faed --- /dev/null +++ b/SampleCodes/MeetingRooms/MeetingRoomsTests/MeetingRoomsTests.swift @@ -0,0 +1,36 @@ +// +// MeetingRoomsTests.swift +// MeetingRoomsTests +// +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest +@testable import MeetingRooms + +class MeetingRoomsTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/SampleCodes/MeetingRooms/MeetingRoomsUITests/Info.plist b/SampleCodes/MeetingRooms/MeetingRoomsUITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MeetingRooms/MeetingRoomsUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MeetingRooms/MeetingRoomsUITests/MeetingRoomsUITests.swift b/SampleCodes/MeetingRooms/MeetingRoomsUITests/MeetingRoomsUITests.swift new file mode 100644 index 0000000..3963da3 --- /dev/null +++ b/SampleCodes/MeetingRooms/MeetingRoomsUITests/MeetingRoomsUITests.swift @@ -0,0 +1,36 @@ +// +// MeetingRoomsUITests.swift +// MeetingRoomsUITests +// +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest + +class MeetingRoomsUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.pbxproj b/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.pbxproj index f11efb9..e96b5ea 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.pbxproj +++ b/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.pbxproj @@ -3,31 +3,70 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 48; objects = { /* Begin PBXBuildFile section */ - 2C99854A1C224D6000FB4C4B /* Money.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9985491C224D6000FB4C4B /* Money.swift */; }; - 2C9AD9EF1C214348004D41FE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9AD9EE1C214348004D41FE /* AppDelegate.swift */; }; - 2C9AD9F11C214348004D41FE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9AD9F01C214348004D41FE /* ViewController.swift */; }; - 2C9AD9F41C214348004D41FE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C9AD9F21C214348004D41FE /* Main.storyboard */; }; - 2C9AD9F61C214348004D41FE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2C9AD9F51C214348004D41FE /* Assets.xcassets */; }; - 2C9AD9F91C214348004D41FE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C9AD9F71C214348004D41FE /* LaunchScreen.storyboard */; }; + 04BDBCF21F823DC5004CC97E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBCF11F823DC5004CC97E /* AppDelegate.swift */; }; + 04BDBCF41F823DC5004CC97E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBCF31F823DC5004CC97E /* ViewController.swift */; }; + 04BDBCF71F823DC5004CC97E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBCF51F823DC5004CC97E /* Main.storyboard */; }; + 04BDBCF91F823DC5004CC97E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBCF81F823DC5004CC97E /* Assets.xcassets */; }; + 04BDBCFC1F823DC5004CC97E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04BDBCFA1F823DC5004CC97E /* LaunchScreen.storyboard */; }; + 04BDBD071F823DC5004CC97E /* MoneyConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD061F823DC5004CC97E /* MoneyConverterTests.swift */; }; + 04BDBD121F823DC5004CC97E /* MoneyConverterUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD111F823DC5004CC97E /* MoneyConverterUITests.swift */; }; + 04BDBD201F8249D4004CC97E /* Money.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BDBD1F1F8249D4004CC97E /* Money.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 04BDBD031F823DC5004CC97E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04BDBCE61F823DC5004CC97E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04BDBCED1F823DC5004CC97E; + remoteInfo = MoneyConverter; + }; + 04BDBD0E1F823DC5004CC97E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04BDBCE61F823DC5004CC97E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04BDBCED1F823DC5004CC97E; + remoteInfo = MoneyConverter; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ - 2C9985491C224D6000FB4C4B /* Money.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Money.swift; sourceTree = ""; }; - 2C9AD9EB1C214347004D41FE /* MoneyConverter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MoneyConverter.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2C9AD9EE1C214348004D41FE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 2C9AD9F01C214348004D41FE /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 2C9AD9F31C214348004D41FE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 2C9AD9F51C214348004D41FE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2C9AD9F81C214348004D41FE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 2C9AD9FA1C214348004D41FE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBCEE1F823DC5004CC97E /* MoneyConverter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MoneyConverter.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBCF11F823DC5004CC97E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 04BDBCF31F823DC5004CC97E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 04BDBCF61F823DC5004CC97E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 04BDBCF81F823DC5004CC97E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 04BDBCFB1F823DC5004CC97E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 04BDBCFD1F823DC5004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD021F823DC5004CC97E /* MoneyConverterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MoneyConverterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBD061F823DC5004CC97E /* MoneyConverterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoneyConverterTests.swift; sourceTree = ""; }; + 04BDBD081F823DC5004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD0D1F823DC5004CC97E /* MoneyConverterUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MoneyConverterUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04BDBD111F823DC5004CC97E /* MoneyConverterUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoneyConverterUITests.swift; sourceTree = ""; }; + 04BDBD131F823DC5004CC97E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDBD1F1F8249D4004CC97E /* Money.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Money.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2C9AD9E81C214347004D41FE /* Frameworks */ = { + 04BDBCEB1F823DC5004CC97E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBCFF1F823DC5004CC97E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD0A1F823DC5004CC97E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -37,46 +76,68 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C9AD9E21C214347004D41FE = { + 04BDBCE51F823DC5004CC97E = { isa = PBXGroup; children = ( - 2C9AD9ED1C214348004D41FE /* MoneyConverter */, - 2C9AD9EC1C214347004D41FE /* Products */, + 04BDBCF01F823DC5004CC97E /* MoneyConverter */, + 04BDBD051F823DC5004CC97E /* MoneyConverterTests */, + 04BDBD101F823DC5004CC97E /* MoneyConverterUITests */, + 04BDBCEF1F823DC5004CC97E /* Products */, ); sourceTree = ""; }; - 2C9AD9EC1C214347004D41FE /* Products */ = { + 04BDBCEF1F823DC5004CC97E /* Products */ = { isa = PBXGroup; children = ( - 2C9AD9EB1C214347004D41FE /* MoneyConverter.app */, + 04BDBCEE1F823DC5004CC97E /* MoneyConverter.app */, + 04BDBD021F823DC5004CC97E /* MoneyConverterTests.xctest */, + 04BDBD0D1F823DC5004CC97E /* MoneyConverterUITests.xctest */, ); name = Products; sourceTree = ""; }; - 2C9AD9ED1C214348004D41FE /* MoneyConverter */ = { + 04BDBCF01F823DC5004CC97E /* MoneyConverter */ = { isa = PBXGroup; children = ( - 2C9AD9EE1C214348004D41FE /* AppDelegate.swift */, - 2C9AD9F01C214348004D41FE /* ViewController.swift */, - 2C9985491C224D6000FB4C4B /* Money.swift */, - 2C9AD9F21C214348004D41FE /* Main.storyboard */, - 2C9AD9F51C214348004D41FE /* Assets.xcassets */, - 2C9AD9F71C214348004D41FE /* LaunchScreen.storyboard */, - 2C9AD9FA1C214348004D41FE /* Info.plist */, + 04BDBCF11F823DC5004CC97E /* AppDelegate.swift */, + 04BDBCF31F823DC5004CC97E /* ViewController.swift */, + 04BDBCF51F823DC5004CC97E /* Main.storyboard */, + 04BDBD1F1F8249D4004CC97E /* Money.swift */, + 04BDBCF81F823DC5004CC97E /* Assets.xcassets */, + 04BDBCFA1F823DC5004CC97E /* LaunchScreen.storyboard */, + 04BDBCFD1F823DC5004CC97E /* Info.plist */, ); path = MoneyConverter; sourceTree = ""; }; + 04BDBD051F823DC5004CC97E /* MoneyConverterTests */ = { + isa = PBXGroup; + children = ( + 04BDBD061F823DC5004CC97E /* MoneyConverterTests.swift */, + 04BDBD081F823DC5004CC97E /* Info.plist */, + ); + path = MoneyConverterTests; + sourceTree = ""; + }; + 04BDBD101F823DC5004CC97E /* MoneyConverterUITests */ = { + isa = PBXGroup; + children = ( + 04BDBD111F823DC5004CC97E /* MoneyConverterUITests.swift */, + 04BDBD131F823DC5004CC97E /* Info.plist */, + ); + path = MoneyConverterUITests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2C9AD9EA1C214347004D41FE /* MoneyConverter */ = { + 04BDBCED1F823DC5004CC97E /* MoneyConverter */ = { isa = PBXNativeTarget; - buildConfigurationList = 2C9AD9FD1C214348004D41FE /* Build configuration list for PBXNativeTarget "MoneyConverter" */; + buildConfigurationList = 04BDBD161F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverter" */; buildPhases = ( - 2C9AD9E71C214347004D41FE /* Sources */, - 2C9AD9E81C214347004D41FE /* Frameworks */, - 2C9AD9E91C214347004D41FE /* Resources */, + 04BDBCEA1F823DC5004CC97E /* Sources */, + 04BDBCEB1F823DC5004CC97E /* Frameworks */, + 04BDBCEC1F823DC5004CC97E /* Resources */, ); buildRules = ( ); @@ -84,81 +145,173 @@ ); name = MoneyConverter; productName = MoneyConverter; - productReference = 2C9AD9EB1C214347004D41FE /* MoneyConverter.app */; + productReference = 04BDBCEE1F823DC5004CC97E /* MoneyConverter.app */; productType = "com.apple.product-type.application"; }; + 04BDBD011F823DC5004CC97E /* MoneyConverterTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04BDBD191F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverterTests" */; + buildPhases = ( + 04BDBCFE1F823DC5004CC97E /* Sources */, + 04BDBCFF1F823DC5004CC97E /* Frameworks */, + 04BDBD001F823DC5004CC97E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04BDBD041F823DC5004CC97E /* PBXTargetDependency */, + ); + name = MoneyConverterTests; + productName = MoneyConverterTests; + productReference = 04BDBD021F823DC5004CC97E /* MoneyConverterTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 04BDBD0C1F823DC5004CC97E /* MoneyConverterUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04BDBD1C1F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverterUITests" */; + buildPhases = ( + 04BDBD091F823DC5004CC97E /* Sources */, + 04BDBD0A1F823DC5004CC97E /* Frameworks */, + 04BDBD0B1F823DC5004CC97E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04BDBD0F1F823DC5004CC97E /* PBXTargetDependency */, + ); + name = MoneyConverterUITests; + productName = MoneyConverterUITests; + productReference = 04BDBD0D1F823DC5004CC97E /* MoneyConverterUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2C9AD9E31C214347004D41FE /* Project object */ = { + 04BDBCE61F823DC5004CC97E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = CodersHigh; + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = Mac; TargetAttributes = { - 2C9AD9EA1C214347004D41FE = { - CreatedOnToolsVersion = 7.1; + 04BDBCED1F823DC5004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + 04BDBD011F823DC5004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 04BDBCED1F823DC5004CC97E; + }; + 04BDBD0C1F823DC5004CC97E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 04BDBCED1F823DC5004CC97E; }; }; }; - buildConfigurationList = 2C9AD9E61C214347004D41FE /* Build configuration list for PBXProject "MoneyConverter" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + buildConfigurationList = 04BDBCE91F823DC5004CC97E /* Build configuration list for PBXProject "MoneyConverter" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 2C9AD9E21C214347004D41FE; - productRefGroup = 2C9AD9EC1C214347004D41FE /* Products */; + mainGroup = 04BDBCE51F823DC5004CC97E; + productRefGroup = 04BDBCEF1F823DC5004CC97E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 2C9AD9EA1C214347004D41FE /* MoneyConverter */, + 04BDBCED1F823DC5004CC97E /* MoneyConverter */, + 04BDBD011F823DC5004CC97E /* MoneyConverterTests */, + 04BDBD0C1F823DC5004CC97E /* MoneyConverterUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2C9AD9E91C214347004D41FE /* Resources */ = { + 04BDBCEC1F823DC5004CC97E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBCFC1F823DC5004CC97E /* LaunchScreen.storyboard in Resources */, + 04BDBCF91F823DC5004CC97E /* Assets.xcassets in Resources */, + 04BDBCF71F823DC5004CC97E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD001F823DC5004CC97E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD0B1F823DC5004CC97E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C9AD9F91C214348004D41FE /* LaunchScreen.storyboard in Resources */, - 2C9AD9F61C214348004D41FE /* Assets.xcassets in Resources */, - 2C9AD9F41C214348004D41FE /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2C9AD9E71C214347004D41FE /* Sources */ = { + 04BDBCEA1F823DC5004CC97E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBD201F8249D4004CC97E /* Money.swift in Sources */, + 04BDBCF41F823DC5004CC97E /* ViewController.swift in Sources */, + 04BDBCF21F823DC5004CC97E /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBCFE1F823DC5004CC97E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C99854A1C224D6000FB4C4B /* Money.swift in Sources */, - 2C9AD9F11C214348004D41FE /* ViewController.swift in Sources */, - 2C9AD9EF1C214348004D41FE /* AppDelegate.swift in Sources */, + 04BDBD071F823DC5004CC97E /* MoneyConverterTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04BDBD091F823DC5004CC97E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04BDBD121F823DC5004CC97E /* MoneyConverterUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 04BDBD041F823DC5004CC97E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04BDBCED1F823DC5004CC97E /* MoneyConverter */; + targetProxy = 04BDBD031F823DC5004CC97E /* PBXContainerItemProxy */; + }; + 04BDBD0F1F823DC5004CC97E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04BDBCED1F823DC5004CC97E /* MoneyConverter */; + targetProxy = 04BDBD0E1F823DC5004CC97E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ - 2C9AD9F21C214348004D41FE /* Main.storyboard */ = { + 04BDBCF51F823DC5004CC97E /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C9AD9F31C214348004D41FE /* Base */, + 04BDBCF61F823DC5004CC97E /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 2C9AD9F71C214348004D41FE /* LaunchScreen.storyboard */ = { + 04BDBCFA1F823DC5004CC97E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 2C9AD9F81C214348004D41FE /* Base */, + 04BDBCFB1F823DC5004CC97E /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -166,29 +319,41 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 2C9AD9FB1C214348004D41FE /* Debug */ = { + 04BDBD141F823DC5004CC97E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -202,38 +367,50 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 2C9AD9FC1C214348004D41FE /* Release */ = { + 04BDBD151F823DC5004CC97E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -241,58 +418,144 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 2C9AD9FE1C214348004D41FE /* Debug */ = { + 04BDBD171F823DC5004CC97E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = MoneyConverter/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MoneyConverter; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverter; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 2C9AD9FF1C214348004D41FE /* Release */ = { + 04BDBD181F823DC5004CC97E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = MoneyConverter/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MoneyConverter; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverter; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 04BDBD1A1F823DC5004CC97E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MoneyConverterTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverterTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MoneyConverter.app/MoneyConverter"; + }; + name = Debug; + }; + 04BDBD1B1F823DC5004CC97E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MoneyConverterTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverterTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MoneyConverter.app/MoneyConverter"; + }; + name = Release; + }; + 04BDBD1D1F823DC5004CC97E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MoneyConverterUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverterUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MoneyConverter; + }; + name = Debug; + }; + 04BDBD1E1F823DC5004CC97E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MoneyConverterUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = Hello.MoneyConverterUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MoneyConverter; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2C9AD9E61C214347004D41FE /* Build configuration list for PBXProject "MoneyConverter" */ = { + 04BDBCE91F823DC5004CC97E /* Build configuration list for PBXProject "MoneyConverter" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04BDBD141F823DC5004CC97E /* Debug */, + 04BDBD151F823DC5004CC97E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04BDBD161F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverter" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04BDBD171F823DC5004CC97E /* Debug */, + 04BDBD181F823DC5004CC97E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04BDBD191F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverterTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C9AD9FB1C214348004D41FE /* Debug */, - 2C9AD9FC1C214348004D41FE /* Release */, + 04BDBD1A1F823DC5004CC97E /* Debug */, + 04BDBD1B1F823DC5004CC97E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2C9AD9FD1C214348004D41FE /* Build configuration list for PBXNativeTarget "MoneyConverter" */ = { + 04BDBD1C1F823DC5004CC97E /* Build configuration list for PBXNativeTarget "MoneyConverterUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2C9AD9FE1C214348004D41FE /* Debug */, - 2C9AD9FF1C214348004D41FE /* Release */, + 04BDBD1D1F823DC5004CC97E /* Debug */, + 04BDBD1E1F823DC5004CC97E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 2C9AD9E31C214347004D41FE /* Project object */; + rootObject = 04BDBCE61F823DC5004CC97E /* Project object */; } diff --git a/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5566428 --- /dev/null +++ b/SampleCodes/MoneyConverter/MoneyConverter.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SampleCodes/MoneyConverter/MoneyConverter/AppDelegate.swift b/SampleCodes/MoneyConverter/MoneyConverter/AppDelegate.swift index 2217838..4977588 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/AppDelegate.swift +++ b/SampleCodes/MoneyConverter/MoneyConverter/AppDelegate.swift @@ -2,8 +2,8 @@ // AppDelegate.swift // MoneyConverter // -// Created by Lingostar on 2015. 12. 16.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit @@ -14,37 +14,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. - - - - - - - return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/SampleCodes/MoneyConverter/MoneyConverter/Assets.xcassets/AppIcon.appiconset/Contents.json b/SampleCodes/MoneyConverter/MoneyConverter/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..1d060ed 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/SampleCodes/MoneyConverter/MoneyConverter/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/LaunchScreen.storyboard b/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/LaunchScreen.storyboard index 2e721e1..f83f6fd 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/LaunchScreen.storyboard +++ b/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/LaunchScreen.storyboard @@ -1,22 +1,20 @@ - + - + + + - - - - - + - - + + diff --git a/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/Main.storyboard b/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/Main.storyboard index 89f6126..098609f 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/Main.storyboard +++ b/SampleCodes/MoneyConverter/MoneyConverter/Base.lproj/Main.storyboard @@ -1,81 +1,80 @@ - - + + + + + - - + + + - - - - - + - - + + + - - - + - - - - + + - - - - + + + - + diff --git a/SampleCodes/MoneyConverter/MoneyConverter/Info.plist b/SampleCodes/MoneyConverter/MoneyConverter/Info.plist index 40c6215..16be3b6 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/Info.plist +++ b/SampleCodes/MoneyConverter/MoneyConverter/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/SampleCodes/MoneyConverter/MoneyConverter/Money.swift b/SampleCodes/MoneyConverter/MoneyConverter/Money.swift index 169ee64..65df134 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/Money.swift +++ b/SampleCodes/MoneyConverter/MoneyConverter/Money.swift @@ -2,33 +2,32 @@ // Money.swift // MoneyConverter // -// Created by Lingostar on 2015. 12. 17.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. // import Foundation -import MapKit -enum Currency:Int { + +enum Currency: Int { case USD = 0, KRW, JPY, EUR - var symbol:String { - get { + var ratio: Double { + get{ switch self { - case .USD : return "$" - case .KRW : return "₩" - case .JPY : return "¥" - case .EUR : return "€" + case .USD: return 1.0 + case .KRW: return 1178.5 + case .JPY: return 122.45 + case .EUR: return 0.92 } } } - - var ratio:Double { - get { + var symbol: String { + get{ switch self { - case .USD : return 1.0 - case .KRW : return 1178.5 - case .JPY : return 122.45 - case .EUR : return 0.92 + case .USD: return "$" + case .KRW: return "₩" + case .JPY: return "¥" + case .EUR: return "€" } } } @@ -36,25 +35,21 @@ enum Currency:Int { struct Money { - //var location:CLLocationCoordinate2D - var usdollar = 0.0 - init(_ _usdollar:Double){ + init(_ _usdollar: Double) { usdollar = _usdollar } - init(_ amount:Double, currency:Currency){ + init(_ amount: Double, currency: Currency) { usdollar = amount / currency.ratio } - - func valueInCurrency(currency:Currency) -> String { - return "\(currency.symbol) " + "\(usdollar*currency.ratio)" + + func valueInCurrency(currency: Currency) -> String { + return "\(currency.symbol)" + "\(usdollar * currency.ratio)" } -} - - -let money = Money(120.0) -let koreanIncome = Money(500_000 , currency:.KRW) +} +let myMoney = Money(120) +let incomeInKRW = Money(350_000, currency: .KRW) diff --git a/SampleCodes/MoneyConverter/MoneyConverter/ViewController.swift b/SampleCodes/MoneyConverter/MoneyConverter/ViewController.swift index 659723e..7bd3729 100644 --- a/SampleCodes/MoneyConverter/MoneyConverter/ViewController.swift +++ b/SampleCodes/MoneyConverter/MoneyConverter/ViewController.swift @@ -2,18 +2,19 @@ // ViewController.swift // MoneyConverter // -// Created by Lingostar on 2015. 12. 16.. -// Copyright © 2015년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit class ViewController: UIViewController { - + @IBOutlet weak var currencySegment: UISegmentedControl! + @IBOutlet weak var sourceMoneyField: UITextField! - @IBOutlet weak var targetMoneyLabel: UILabel! + @IBOutlet weak var targetMoneyLable: UILabel! override func viewDidLoad() { super.viewDidLoad() @@ -25,43 +26,29 @@ class ViewController: UIViewController { // Dispose of any resources that can be recreated. } - @IBAction func convertMoney(sender: AnyObject) { - guard let sourceCurrecy = Currency(rawValue:currencySegment.selectedSegmentIndex) else { + @IBAction func convertMoney(_ sender: Any) { + + guard let sourceCurrency = Currency(rawValue: currencySegment.selectedSegmentIndex) else { print("Source Currency Error") return - } // if let 의 확장판. if let을 썼을때 indent 불편을 없앰. - + } + guard let sourceAmount = Double(sourceMoneyField.text!) else { - targetMoneyLabel.text = "Error" + targetMoneyLable.text = "Error" return } - let sourceMoney = Money(sourceAmount, currency: sourceCurrecy) - + let sourceMoney = Money(_ : sourceAmount, currency: sourceCurrency) + var targetMoneyString = "" - for (var i=0 ; i < 4 ; i++){ - targetMoneyString += sourceMoney.valueInCurrency(Currency.init(rawValue: i)!) + for i in 0...3 { + targetMoneyString += + sourceMoney.valueInCurrency(currency: Currency.init(rawValue: i)!) targetMoneyString += "\r\n" } - targetMoneyLabel.text = targetMoneyString - - /*if let sourceCurrecy = Currency(rawValue:currencySegment.selectedSegmentIndex) { - - if let sourceAmount = Double(sourceMoneyField.text!) { - - let sourceMoney = Money(sourceAmount, currency: sourceCurrecy) - - var targetMoneyString = "" - for (var i=0 ; i < 4 ; i++){ - targetMoneyString += sourceMoney.valueInCurrency(Currency.init(rawValue: i)!) - targetMoneyString += "\r\n" - } - - targetMoneyLabel.text = targetMoneyString - } - }*/ + targetMoneyLable.text = targetMoneyString } - + } diff --git a/SampleCodes/MoneyConverter/MoneyConverterTests/Info.plist b/SampleCodes/MoneyConverter/MoneyConverterTests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MoneyConverter/MoneyConverterTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MoneyConverter/MoneyConverterTests/MoneyConverterTests.swift b/SampleCodes/MoneyConverter/MoneyConverterTests/MoneyConverterTests.swift new file mode 100644 index 0000000..3df966b --- /dev/null +++ b/SampleCodes/MoneyConverter/MoneyConverterTests/MoneyConverterTests.swift @@ -0,0 +1,36 @@ +// +// MoneyConverterTests.swift +// MoneyConverterTests +// +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest +@testable import MoneyConverter + +class MoneyConverterTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/SampleCodes/MoneyConverter/MoneyConverterUITests/Info.plist b/SampleCodes/MoneyConverter/MoneyConverterUITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MoneyConverter/MoneyConverterUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MoneyConverter/MoneyConverterUITests/MoneyConverterUITests.swift b/SampleCodes/MoneyConverter/MoneyConverterUITests/MoneyConverterUITests.swift new file mode 100644 index 0000000..bcf0207 --- /dev/null +++ b/SampleCodes/MoneyConverter/MoneyConverterUITests/MoneyConverterUITests.swift @@ -0,0 +1,36 @@ +// +// MoneyConverterUITests.swift +// MoneyConverterUITests +// +// Created by Mac on 2017. 10. 2.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest + +class MoneyConverterUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} From fc9944488fcb574e72d104cd9f7209619b7fb9db Mon Sep 17 00:00:00 2001 From: June <31872218+wimara0228@users.noreply.github.com> Date: Sat, 4 Nov 2017 21:16:54 +0900 Subject: [PATCH 2/4] ch 2 --- Chapter2/Session2.playground/Contents.swift | 14 +++++++------- Chapter2/Session2.playground/timeline.xctimeline | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Chapter2/Session2.playground/Contents.swift b/Chapter2/Session2.playground/Contents.swift index daf3d6f..a1f114a 100644 --- a/Chapter2/Session2.playground/Contents.swift +++ b/Chapter2/Session2.playground/Contents.swift @@ -94,7 +94,7 @@ roomCapacity["Kahlo"] let roomNames = [String](roomCapacity.keys) let capacities = [Int](roomCapacity.values) -let total = capacities.reduce(0, combine: +) +let total = capacities.reduce(0, +) //: Session 2-6 컬렉션2 Set let subway2 :Set = ["시청", "을지로입구", "을지로3가", "을지로4가","동대문역사문화공원", "신당", "상왕십리", "왕십리", "한양대", "뚝섬", "성수", "건대입구", "구의", "강변", "잠실나루", "잠실", "신천", "종합운동장", "삼성", "선릉", "역삼", "강남", "교대", "서초", "방배", "사당", "낙성대", "서울대입구", "봉천", "신림", "신대방", "구로디지털단지", "대림", "신도림", "문래", "영등포구청", "당산", "합정", "홍대입구", "신촌", "이대", "아현", "충정로"] @@ -103,14 +103,14 @@ subway2.count let subway3 :Set = ["지축", "구파발", "연신내", "불광", "녹번", "홍제", "무악재", "독립문", "경복궁", "안국", "종로3가", "을지로3가", "충무로", "동대입구", "약수", "금호", "옥수", "압구정", "신사", "잠원", "고속터미널", "교대", "남부터미널", "양재", "매봉", "도곡", "대치", "학여울", "대청", "일원", "수서", "가락시장", "경찰병원", "오금"] subway3.count -let transfer = subway2.intersect(subway3) +let transfer = subway2.intersection(subway3) transfer.count -let notTransfer = subway2.subtract(subway3) +let notTransfer = subway2.subtracting(subway3) notTransfer.count let union = subway2.union(subway3) union.count -let exOR = subway2.exclusiveOr(subway3) +let exOR = subway2.symmetricDifference(subway3) exOR.count if transfer.count > 0 { @@ -206,7 +206,7 @@ func ratingRecord (history:[Double]) -> (average:Double, min:Double, max:Double) ratings = [3.5, 2.0, 4.5, 5.0] bookDescription = "\(title)" -if let theRatings = ratings , record = ratingRecord(theRatings) { +if let theRatings = ratings , let record = ratingRecord(history: theRatings) { bookDescription += " has \(theRatings.count) ratings, \r\n average is \(record.average), from \(record.min) to \(record.max)" } else { bookDescription += " has no ratings yet" @@ -438,7 +438,7 @@ _={ } func callTaskToBoss() -> Task? { - if let myBoss = boss, callTo = myBoss.phoneNumber { + if let myBoss = boss, let callTo = myBoss.phoneNumber { var callTask = Task(type: .Call, owner: self) return callTask } @@ -539,7 +539,7 @@ _={ } func callTaskToBoss() -> Task? { - if let myBoss = boss, callTo = myBoss.phoneNumber { + if let myBoss = boss, let callTo = myBoss.phoneNumber { var callTask = Task(type: .Call(number:callTo), owner: self) return callTask } diff --git a/Chapter2/Session2.playground/timeline.xctimeline b/Chapter2/Session2.playground/timeline.xctimeline index 2eeb328..bd188b8 100644 --- a/Chapter2/Session2.playground/timeline.xctimeline +++ b/Chapter2/Session2.playground/timeline.xctimeline @@ -3,39 +3,39 @@ version = "3.0"> From b86c4f7f9787e6a758fffbb42f24935e3c5e640d Mon Sep 17 00:00:00 2001 From: June <31872218+wimara0228@users.noreply.github.com> Date: Sat, 4 Nov 2017 21:19:00 +0900 Subject: [PATCH 3/4] ch 5 --- Chapter5/SwiftFunctionType.playground/Contents.swift | 4 ++-- Chapter5/SwiftFunctionType.playground/timeline.xctimeline | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Chapter5/SwiftFunctionType.playground/Contents.swift b/Chapter5/SwiftFunctionType.playground/Contents.swift index 9222f30..2356ef7 100644 --- a/Chapter5/SwiftFunctionType.playground/Contents.swift +++ b/Chapter5/SwiftFunctionType.playground/Contents.swift @@ -4,9 +4,9 @@ import UIKit //: Session 5-1 Function Types -/*func addVAT(source:Double) -> Double { +func addVAT(source:Double) -> Double { return source * 1.1 -}*/ +} func couponDiscount(source:Double) -> Double { return source * 0.9 diff --git a/Chapter5/SwiftFunctionType.playground/timeline.xctimeline b/Chapter5/SwiftFunctionType.playground/timeline.xctimeline index 6cdf29c..c72e1c5 100644 --- a/Chapter5/SwiftFunctionType.playground/timeline.xctimeline +++ b/Chapter5/SwiftFunctionType.playground/timeline.xctimeline @@ -3,12 +3,12 @@ version = "3.0"> From a8619f3aff1adb3b3a3bb76a6aa8bb841df5480e Mon Sep 17 00:00:00 2001 From: June <31872218+wimara0228@users.noreply.github.com> Date: Sun, 5 Nov 2017 16:18:44 +0900 Subject: [PATCH 4/4] dyna --- .../project.pbxproj | 330 ------ .../BranchListViewController.swift | 72 -- .../MeetingRoomsListController.swift | 179 ---- .../ReserveRoomViewController.swift | 162 --- .../ServiceListViewController.swift | 49 - .../MeetingRooms_01.xcodeproj/project.pbxproj | 597 +++++++++++ .../contents.xcworkspacedata | 7 + .../AppDelegate.swift | 30 +- .../AppIcon.appiconset/Contents.json | 25 + .../Assets.xcassets/Contents.json | 0 .../building_tab.imageset/Contents.json | 0 .../building_tab.imageset/building_tab.png | Bin .../equipment_tab.imageset/Contents.json | 0 .../equipment_tab.imageset/equipment_tab.png | Bin .../location.imageset/Contents.json | 0 .../location.imageset/location.png | Bin .../Base.lproj/LaunchScreen.storyboard | 16 +- .../Base.lproj/Main.storyboard | 993 +++++++++--------- .../BranchListViewController.swift | 110 ++ .../DataCenter.swift | 103 +- .../EquipmentsDefault.plist | 2 +- .../EquipmentsListViewController.swift | 52 +- .../Info.plist | 4 +- .../MeetingRoomListTableViewController.swift | 101 ++ .../ReservationListViewController.swift | 57 +- .../ReserveRoomViewController.swift | 153 +++ .../RoomInfoViewController.swift | 52 +- .../ServiceListViewController.swift | 106 ++ .../TintColorViewController.swift | 56 +- .../MeetingRooms_01/ViewController.swift | 25 + .../MeetingRooms_01Tests/Info.plist | 22 + .../MeetingRooms_01Tests.swift | 36 + .../MeetingRooms_01UITests/Info.plist | 22 + .../MeetingRooms_01UITests.swift | 36 + SampleCodes/MeetingRoomsDynamic/building.png | Bin 11950 -> 0 bytes SampleCodes/MeetingRoomsDynamic/equipment.png | Bin 17736 -> 0 bytes SampleCodes/MeetingRoomsDynamic/location.png | Bin 3383 -> 0 bytes 37 files changed, 1898 insertions(+), 1499 deletions(-) delete mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic.xcodeproj/project.pbxproj delete mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/BranchListViewController.swift delete mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/MeetingRoomsListController.swift delete mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReserveRoomViewController.swift delete mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ServiceListViewController.swift create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.pbxproj create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/AppDelegate.swift (59%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/AppIcon.appiconset/Contents.json (73%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/Contents.json (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/building_tab.imageset/Contents.json (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/building_tab.imageset/building_tab.png (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/equipment_tab.imageset/Contents.json (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/equipment_tab.imageset/equipment_tab.png (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/location.imageset/Contents.json (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Assets.xcassets/location.imageset/location.png (100%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Base.lproj/LaunchScreen.storyboard (58%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Base.lproj/Main.storyboard (50%) create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/BranchListViewController.swift rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/DataCenter.swift (52%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/EquipmentsDefault.plist (95%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/EquipmentsListViewController.swift (60%) rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/Info.plist (95%) create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/MeetingRoomListTableViewController.swift rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/ReservationListViewController.swift (59%) create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReserveRoomViewController.swift rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/RoomInfoViewController.swift (58%) create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ServiceListViewController.swift rename SampleCodes/MeetingRoomsDynamic/{MeetingRoomsDynamic => MeetingRooms_01}/TintColorViewController.swift (50%) create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ViewController.swift create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/Info.plist create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/MeetingRooms_01Tests.swift create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/Info.plist create mode 100644 SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/MeetingRooms_01UITests.swift delete mode 100644 SampleCodes/MeetingRoomsDynamic/building.png delete mode 100644 SampleCodes/MeetingRoomsDynamic/equipment.png delete mode 100644 SampleCodes/MeetingRoomsDynamic/location.png diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic.xcodeproj/project.pbxproj b/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic.xcodeproj/project.pbxproj deleted file mode 100644 index cd8935e..0000000 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic.xcodeproj/project.pbxproj +++ /dev/null @@ -1,330 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 2C1A2E7B1CC7603D0069EEED /* TintColorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1A2E7A1CC7603D0069EEED /* TintColorViewController.swift */; }; - 2C5B2DA81CC71E8D007D75DD /* EquipmentsDefault.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2C5B2DA71CC71E8D007D75DD /* EquipmentsDefault.plist */; }; - 2C5B2DAA1CC726B8007D75DD /* EquipmentsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C5B2DA91CC726B8007D75DD /* EquipmentsListViewController.swift */; }; - 2C6F67101CC233F5007EAEC7 /* RoomInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6F670F1CC233F5007EAEC7 /* RoomInfoViewController.swift */; }; - 2C6F67121CC342F3007EAEC7 /* ReservationListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6F67111CC342F3007EAEC7 /* ReservationListViewController.swift */; }; - 2C6F67141CC34BDF007EAEC7 /* ReserveRoomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6F67131CC34BDF007EAEC7 /* ReserveRoomViewController.swift */; }; - 2C9C276A1C958848002525E4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9C27691C958848002525E4 /* AppDelegate.swift */; }; - 2C9C276F1C958848002525E4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C9C276D1C958848002525E4 /* Main.storyboard */; }; - 2C9C27711C958849002525E4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2C9C27701C958849002525E4 /* Assets.xcassets */; }; - 2C9C27741C958849002525E4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2C9C27721C958849002525E4 /* LaunchScreen.storyboard */; }; - 2C9C277C1C9588BE002525E4 /* MeetingRoomsListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9C277B1C9588BE002525E4 /* MeetingRoomsListController.swift */; }; - 2CAA1EF41CB3F36D0096F3FA /* DataCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA1EF31CB3F36D0096F3FA /* DataCenter.swift */; }; - 2CAA1EF61CB3FA630096F3FA /* BranchListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA1EF51CB3FA630096F3FA /* BranchListViewController.swift */; }; - 2CAA1EF81CB3FA7C0096F3FA /* ServiceListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA1EF71CB3FA7C0096F3FA /* ServiceListViewController.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2C1A2E7A1CC7603D0069EEED /* TintColorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TintColorViewController.swift; sourceTree = ""; }; - 2C5B2DA71CC71E8D007D75DD /* EquipmentsDefault.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = EquipmentsDefault.plist; sourceTree = ""; }; - 2C5B2DA91CC726B8007D75DD /* EquipmentsListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EquipmentsListViewController.swift; sourceTree = ""; }; - 2C6F670F1CC233F5007EAEC7 /* RoomInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomInfoViewController.swift; sourceTree = ""; }; - 2C6F67111CC342F3007EAEC7 /* ReservationListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservationListViewController.swift; sourceTree = ""; }; - 2C6F67131CC34BDF007EAEC7 /* ReserveRoomViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReserveRoomViewController.swift; sourceTree = ""; }; - 2C9C27661C958847002525E4 /* MeetingRoomsDynamic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeetingRoomsDynamic.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2C9C27691C958848002525E4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 2C9C276E1C958848002525E4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 2C9C27701C958849002525E4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2C9C27731C958849002525E4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 2C9C27751C958849002525E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2C9C277B1C9588BE002525E4 /* MeetingRoomsListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingRoomsListController.swift; sourceTree = ""; }; - 2CAA1EF31CB3F36D0096F3FA /* DataCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCenter.swift; sourceTree = ""; }; - 2CAA1EF51CB3FA630096F3FA /* BranchListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BranchListViewController.swift; sourceTree = ""; }; - 2CAA1EF71CB3FA7C0096F3FA /* ServiceListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceListViewController.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 2C9C27631C958847002525E4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2C9C275D1C958847002525E4 = { - isa = PBXGroup; - children = ( - 2C9C27681C958847002525E4 /* MeetingRoomsDynamic */, - 2C9C27671C958847002525E4 /* Products */, - ); - sourceTree = ""; - }; - 2C9C27671C958847002525E4 /* Products */ = { - isa = PBXGroup; - children = ( - 2C9C27661C958847002525E4 /* MeetingRoomsDynamic.app */, - ); - name = Products; - sourceTree = ""; - }; - 2C9C27681C958847002525E4 /* MeetingRoomsDynamic */ = { - isa = PBXGroup; - children = ( - 2C9C27691C958848002525E4 /* AppDelegate.swift */, - 2CAA1EF51CB3FA630096F3FA /* BranchListViewController.swift */, - 2CAA1EF71CB3FA7C0096F3FA /* ServiceListViewController.swift */, - 2C9C277B1C9588BE002525E4 /* MeetingRoomsListController.swift */, - 2CAA1EF31CB3F36D0096F3FA /* DataCenter.swift */, - 2C6F670F1CC233F5007EAEC7 /* RoomInfoViewController.swift */, - 2C6F67111CC342F3007EAEC7 /* ReservationListViewController.swift */, - 2C6F67131CC34BDF007EAEC7 /* ReserveRoomViewController.swift */, - 2C9C276D1C958848002525E4 /* Main.storyboard */, - 2C1A2E7A1CC7603D0069EEED /* TintColorViewController.swift */, - 2C5B2DA91CC726B8007D75DD /* EquipmentsListViewController.swift */, - 2C9C27701C958849002525E4 /* Assets.xcassets */, - 2C9C27721C958849002525E4 /* LaunchScreen.storyboard */, - 2C5B2DA71CC71E8D007D75DD /* EquipmentsDefault.plist */, - 2C9C27751C958849002525E4 /* Info.plist */, - ); - path = MeetingRoomsDynamic; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 2C9C27651C958847002525E4 /* MeetingRoomsDynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2C9C27781C958849002525E4 /* Build configuration list for PBXNativeTarget "MeetingRoomsDynamic" */; - buildPhases = ( - 2C9C27621C958847002525E4 /* Sources */, - 2C9C27631C958847002525E4 /* Frameworks */, - 2C9C27641C958847002525E4 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MeetingRoomsDynamic; - productName = MeetingRoomsDynamic; - productReference = 2C9C27661C958847002525E4 /* MeetingRoomsDynamic.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 2C9C275E1C958847002525E4 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = CodersHigh; - TargetAttributes = { - 2C9C27651C958847002525E4 = { - CreatedOnToolsVersion = 7.1; - }; - }; - }; - buildConfigurationList = 2C9C27611C958847002525E4 /* Build configuration list for PBXProject "MeetingRoomsDynamic" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 2C9C275D1C958847002525E4; - productRefGroup = 2C9C27671C958847002525E4 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 2C9C27651C958847002525E4 /* MeetingRoomsDynamic */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 2C9C27641C958847002525E4 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2C5B2DA81CC71E8D007D75DD /* EquipmentsDefault.plist in Resources */, - 2C9C27741C958849002525E4 /* LaunchScreen.storyboard in Resources */, - 2C9C27711C958849002525E4 /* Assets.xcassets in Resources */, - 2C9C276F1C958848002525E4 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 2C9C27621C958847002525E4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2CAA1EF81CB3FA7C0096F3FA /* ServiceListViewController.swift in Sources */, - 2C6F67121CC342F3007EAEC7 /* ReservationListViewController.swift in Sources */, - 2C5B2DAA1CC726B8007D75DD /* EquipmentsListViewController.swift in Sources */, - 2C6F67141CC34BDF007EAEC7 /* ReserveRoomViewController.swift in Sources */, - 2CAA1EF41CB3F36D0096F3FA /* DataCenter.swift in Sources */, - 2C9C277C1C9588BE002525E4 /* MeetingRoomsListController.swift in Sources */, - 2CAA1EF61CB3FA630096F3FA /* BranchListViewController.swift in Sources */, - 2C9C276A1C958848002525E4 /* AppDelegate.swift in Sources */, - 2C6F67101CC233F5007EAEC7 /* RoomInfoViewController.swift in Sources */, - 2C1A2E7B1CC7603D0069EEED /* TintColorViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 2C9C276D1C958848002525E4 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 2C9C276E1C958848002525E4 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 2C9C27721C958849002525E4 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 2C9C27731C958849002525E4 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 2C9C27761C958849002525E4 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 2C9C27771C958849002525E4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 2C9C27791C958849002525E4 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = MeetingRoomsDynamic/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MeetingRoomsDynamic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 2C9C277A1C958849002525E4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = MeetingRoomsDynamic/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.codershigh.MeetingRoomsDynamic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2C9C27611C958847002525E4 /* Build configuration list for PBXProject "MeetingRoomsDynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2C9C27761C958849002525E4 /* Debug */, - 2C9C27771C958849002525E4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2C9C27781C958849002525E4 /* Build configuration list for PBXNativeTarget "MeetingRoomsDynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2C9C27791C958849002525E4 /* Debug */, - 2C9C277A1C958849002525E4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 2C9C275E1C958847002525E4 /* Project object */; -} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/BranchListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/BranchListViewController.swift deleted file mode 100644 index 2aaf60e..0000000 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/BranchListViewController.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// BranchListViewController.swift -// MeetingRoomsDynamic -// -// Created by Lingostar on 2016. 4. 5.. -// Copyright © 2016년 CodersHigh. All rights reserved. -// - -import UIKit - -class BranchListViewController: UITableViewController { - - override func viewDidLoad() { - self.title = "지점" - } - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - - return 1 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - - let rowCount = dataCenter.branches.count - return rowCount - } - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("BranchCell", forIndexPath: indexPath) - - let branch = dataCenter.branches[indexPath.row] - cell.textLabel?.text = branch.name - return cell - } - - - /* - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if segue.identifier == "ServiceSegue" { - if let destination = segue.destinationViewController as? ServiceListViewController { - if let selectedIndex = self.tableView.indexPathForSelectedRow?.row { - destination.branch = dataCenter.branches[selectedIndex] as Branch - } - - } - } - } - */ - - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if segue.identifier == "ServiceSegue" { - guard let destination = segue.destinationViewController as? ServiceListViewController, selectedIndex = self.tableView.indexPathForSelectedRow?.row else { - return - } - destination.branch = dataCenter.branches[selectedIndex] as Branch - } - } - @IBAction func locationTurnOn(sender: AnyObject) { - - let locationAlert = UIAlertController(title: "위치 정보 요청", message: "위치 정보를 기반으로 가까운 지점을 자동으로 선택할 수 있습니다. 또는 지도앱에서 지점의 위치 정보를 제공해 드립니다. 선택하신 기능이 계속 제공됩니다. 환경설정에서 제공되는 기능을 변경할 수 있습니다.", preferredStyle: .ActionSheet) - let locationAction = UIAlertAction(title: "위치정보 켜기", style: .Default, handler: { (action:UIAlertAction) -> Void in - print ("위치정보 켜기 선택") - }) - let openMapAction = UIAlertAction(title: "지도앱에서 열기", style: .Default, handler: { (action:UIAlertAction) -> Void in - print ("지도앱에서 열기 선택") - }) - - locationAlert.addAction(locationAction) - locationAlert.addAction(openMapAction) - self.presentViewController(locationAlert, animated: true, completion: nil) - } -} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/MeetingRoomsListController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/MeetingRoomsListController.swift deleted file mode 100644 index 2fda216..0000000 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/MeetingRoomsListController.swift +++ /dev/null @@ -1,179 +0,0 @@ -// -// MeetingRoomsListController.swift -// MeetingRoomsDynamic -// -// Created by Lingostar on 2016. 3. 13.. -// Copyright © 2016년 CodersHigh. All rights reserved. -// - -import UIKit - -/* -class MeetingRoomsListController: UITableViewController { - - //var meetingRooms:[String:Int] = ["Banksy":4, "Rivera":8, "Kahlo":8, "Picasso":10, "Cezanne":20, "Matisse":30, "Renoir":40] - var meetingRooms:[String:[String:Int]] = ["Meeting":["Banksy":4, "Rivera":8, "Kahlo":8, "Picasso":10], "Seminar":["Cezanne":20, "Matisse":30, "Renoir":40]] - - func meetingRoomsAtIndex(index:Int) -> (key:String, value:[String:Int]) { - let orderedMeetingRooms = meetingRooms.sort({$0.1.first!.1 < $1.1.first!.1}) - return orderedMeetingRooms[index] - } - //Generic - - - override func viewDidLoad() { - super.viewDidLoad() - - // Uncomment the following line to preserve selection between presentations - // self.clearsSelectionOnViewWillAppear = false - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem() - - - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - // MARK: - Table view data source - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - // #warning Incomplete implementation, return the number of sections - return meetingRooms.count - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // #warning Incomplete implementation, return the number of rows - //let categoryValues = Array(meetingRooms.values)[section] - - //let orderedMeetingRooms = meetingRooms.sort({$0.1.first!.1 < $1.1.first!.1}) - - //let rowCount = orderedMeetingRooms[section].1.count - let rowCount = meetingRoomsAtIndex(section).value.count - return rowCount - } - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) - - //let orderedMeetingRooms = meetingRooms.sort({$0.1.first!.1 < $1.1.first!.1}) - //let categoryValue = orderedMeetingRooms[indexPath.section].1 - let categoryValue = meetingRoomsAtIndex(indexPath.section).value - - let orderedCategoryValues = categoryValue.sort({$0.1 < $1.1}) - let roomName = orderedCategoryValues[indexPath.row].0 - let capacity = orderedCategoryValues[indexPath.row].1 - - cell.textLabel!.text = roomName - cell.detailTextLabel!.text = "\(capacity)" - - return cell - } - - - override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - - return Array(meetingRooms.keys)[section] - } - - override func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { - - let rowCount = Array(meetingRooms.values)[section].count - - return "\(rowCount) rooms" - } - - /* - // Override to support conditional editing of the table view. - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { - // Return false if you do not want the specified item to be editable. - return true - } - */ - - /* - // Override to support editing the table view. - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == .Delete { - // Delete the row from the data source - tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) - } else if editingStyle == .Insert { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } - } - */ - - /* - // Override to support rearranging the table view. - override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { - - } - */ - - /* - // Override to support conditional rearranging of the table view. - override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { - // Return false if you do not want the item to be re-orderable. - return true - } - */ - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ - -} - - */ - - -class MeetingRoomsListController: UITableViewController { - var service:Service? - - override func viewDidLoad() { - self.title = service?.name - } - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - - return 1 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let rowCount = service?.item?.count else { - return 0 - } - return rowCount - } - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell", forIndexPath: indexPath) - - guard let meetingRoom = service?.item?[indexPath.row] else { - return cell - } - cell.textLabel?.text = meetingRoom.name - cell.detailTextLabel?.text = String(meetingRoom.capacity) - return cell - } - - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if segue.identifier == "ReservationSegue" { - guard let destination = segue.destinationViewController as? ReservationListViewController, selectedIndex = self.tableView.indexPathForSelectedRow?.row , meetingRoom = service?.item?[selectedIndex] else { - return - } - destination.meetingRoom = meetingRoom - } - } -} - - diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReserveRoomViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReserveRoomViewController.swift deleted file mode 100644 index 49483ea..0000000 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReserveRoomViewController.swift +++ /dev/null @@ -1,162 +0,0 @@ -// -// ReserveRoomViewController.swift -// MeetingRoomsDynamic -// -// Created by Lingostar on 2016. 4. 17.. -// Copyright © 2016년 CodersHigh. All rights reserved. -// - -import UIKit - -class ReserveRoomViewController: UITableViewController { - - //var reservation:Reservation? - - @IBOutlet weak var hostNameField: UITextField! - @IBOutlet weak var datePicker: UIDatePicker! - @IBOutlet weak var attendeesField: UITextField! - @IBOutlet weak var equipmentsField: UITextField! - @IBOutlet weak var cateringSwitch: UISwitch! - - - - override func viewDidLoad() { - super.viewDidLoad() - - // Uncomment the following line to preserve selection between presentations - // self.clearsSelectionOnViewWillAppear = false - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem() - - - } - - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - @IBAction func makeReservation(sender: AnyObject) { - guard let reservation = makeReservation() else { - self.dismissViewControllerAnimated(true, completion: { - }) - return - } - - switch self.presentingViewController { - case let tabBarC as UITabBarController: - if let navigationC = tabBarC.selectedViewController as? UINavigationController, reservationListVC = navigationC.topViewController as? ReservationListViewController { - reservationListVC.addNewItem(reservation) - } - case let navigationC as UINavigationController: - if let reservationListVC = navigationC.topViewController as? ReservationListViewController { - reservationListVC.addNewItem(reservation) - } - case let reservationListVC as ReservationListViewController: - reservationListVC.addNewItem(reservation) - default: - print("Cannot find ReservationListViewController") - break - } - - self.dismissViewControllerAnimated(true, completion: { - }) - - } - - - @IBAction func cancelReservation(sender: AnyObject) { - self.dismissViewControllerAnimated(true, completion: nil) - } - - - - - - // MARK: - Table view data source - /* - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - // #warning Incomplete implementation, return the number of sections - return 0 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // #warning Incomplete implementation, return the number of rows - return 0 - } - - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) - - // Configure the cell... - - return cell - } - */ - - /* - // Override to support conditional editing of the table view. - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { - // Return false if you do not want the specified item to be editable. - return true - } - */ - - /* - // Override to support editing the table view. - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == .Delete { - // Delete the row from the data source - tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) - } else if editingStyle == .Insert { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } - } - */ - - /* - // Override to support rearranging the table view. - override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { - - } - */ - - /* - // Override to support conditional rearranging of the table view. - override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { - // Return false if you do not want the item to be re-orderable. - return true - } - */ - - - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if segue.identifier == "ReserveDone" { - guard let newReservation = makeReservation(), reservationListVC = segue.destinationViewController as? ReservationListViewController else { - return - } - reservationListVC.addNewItem(newReservation) - } - } - - func makeReservation() -> Reservation? { - let newReservation = Reservation() - let host = hostNameField.text! - if host.isEmpty { - return nil - } - newReservation.hostName = host - newReservation.date = datePicker.date - if let equipmentArray = equipmentsField.text?.characters.split(",").map(String.init) { - newReservation.equipments = equipmentArray - } - newReservation.catering = cateringSwitch.on - return newReservation - } -} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ServiceListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ServiceListViewController.swift deleted file mode 100644 index 239fb74..0000000 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ServiceListViewController.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// ServiceListViewController.swift -// MeetingRoomsDynamic -// -// Created by Lingostar on 2016. 4. 5.. -// Copyright © 2016년 CodersHigh. All rights reserved. -// - -import UIKit - -class ServiceListViewController: UITableViewController { - - var branch:Branch? - - override func viewDidLoad() { - self.title = branch?.name - } - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - - return 1 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let rowCount = branch?.services?.count else { - return 0 - } - return rowCount - } - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("ServiceCell", forIndexPath: indexPath) - - guard let service = branch?.services?[indexPath.row] else { - return cell - } - cell.textLabel?.text = service.name - return cell - } - - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if segue.identifier == "MeetingRoomSegue" { - guard let destination = segue.destinationViewController as? MeetingRoomsListController, selectedIndex = self.tableView.indexPathForSelectedRow?.row , service = branch?.services?[selectedIndex] else { - return - } - destination.service = service - } - } -} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.pbxproj b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7848f97 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.pbxproj @@ -0,0 +1,597 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 0413D72E1FADEF2E00DF618C /* DataCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D72D1FADEF2E00DF618C /* DataCenter.swift */; }; + 0413D7301FADF18E00DF618C /* BranchListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D72F1FADF18E00DF618C /* BranchListViewController.swift */; }; + 0413D7321FADF1A600DF618C /* ServiceListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D7311FADF1A600DF618C /* ServiceListViewController.swift */; }; + 0413D7341FAE065400DF618C /* RoomInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D7331FAE065400DF618C /* RoomInfoViewController.swift */; }; + 0413D7361FAE09E900DF618C /* ReservationListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D7351FAE09E900DF618C /* ReservationListViewController.swift */; }; + 0413D7381FAE0A1400DF618C /* ReserveRoomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0413D7371FAE0A1400DF618C /* ReserveRoomViewController.swift */; }; + 0474F84F1F8E3F850043AEA0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0474F84E1F8E3F850043AEA0 /* AppDelegate.swift */; }; + 0474F8511F8E3F850043AEA0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0474F8501F8E3F850043AEA0 /* ViewController.swift */; }; + 0474F8541F8E3F850043AEA0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0474F8521F8E3F850043AEA0 /* Main.storyboard */; }; + 0474F8561F8E3F850043AEA0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0474F8551F8E3F850043AEA0 /* Assets.xcassets */; }; + 0474F8591F8E3F850043AEA0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0474F8571F8E3F850043AEA0 /* LaunchScreen.storyboard */; }; + 0474F8641F8E3F850043AEA0 /* MeetingRooms_01Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0474F8631F8E3F850043AEA0 /* MeetingRooms_01Tests.swift */; }; + 0474F86F1F8E3F850043AEA0 /* MeetingRooms_01UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0474F86E1F8E3F850043AEA0 /* MeetingRooms_01UITests.swift */; }; + 0474F87D1F8E3FFF0043AEA0 /* MeetingRoomListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0474F87C1F8E3FFF0043AEA0 /* MeetingRoomListTableViewController.swift */; }; + 04D344DB1FAEA773008F4ABF /* TintColorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D344DA1FAEA773008F4ABF /* TintColorViewController.swift */; }; + 04D344DD1FAEE2FF008F4ABF /* EquipmentsDefault.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04D344DC1FAEE2FF008F4ABF /* EquipmentsDefault.plist */; }; + 04D344DF1FAEE3BF008F4ABF /* EquipmentsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D344DE1FAEE3BF008F4ABF /* EquipmentsListViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0474F8601F8E3F850043AEA0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0474F8431F8E3F850043AEA0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0474F84A1F8E3F850043AEA0; + remoteInfo = MeetingRooms_01; + }; + 0474F86B1F8E3F850043AEA0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0474F8431F8E3F850043AEA0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0474F84A1F8E3F850043AEA0; + remoteInfo = MeetingRooms_01; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0413D72D1FADEF2E00DF618C /* DataCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataCenter.swift; sourceTree = ""; }; + 0413D72F1FADF18E00DF618C /* BranchListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BranchListViewController.swift; sourceTree = ""; }; + 0413D7311FADF1A600DF618C /* ServiceListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceListViewController.swift; sourceTree = ""; }; + 0413D7331FAE065400DF618C /* RoomInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomInfoViewController.swift; sourceTree = ""; }; + 0413D7351FAE09E900DF618C /* ReservationListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservationListViewController.swift; sourceTree = ""; }; + 0413D7371FAE0A1400DF618C /* ReserveRoomViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReserveRoomViewController.swift; sourceTree = ""; }; + 0474F84B1F8E3F850043AEA0 /* MeetingRooms_01.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeetingRooms_01.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 0474F84E1F8E3F850043AEA0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 0474F8501F8E3F850043AEA0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 0474F8531F8E3F850043AEA0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 0474F8551F8E3F850043AEA0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 0474F8581F8E3F850043AEA0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 0474F85A1F8E3F850043AEA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0474F85F1F8E3F850043AEA0 /* MeetingRooms_01Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeetingRooms_01Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0474F8631F8E3F850043AEA0 /* MeetingRooms_01Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingRooms_01Tests.swift; sourceTree = ""; }; + 0474F8651F8E3F850043AEA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0474F86A1F8E3F850043AEA0 /* MeetingRooms_01UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeetingRooms_01UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0474F86E1F8E3F850043AEA0 /* MeetingRooms_01UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingRooms_01UITests.swift; sourceTree = ""; }; + 0474F8701F8E3F850043AEA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0474F87C1F8E3FFF0043AEA0 /* MeetingRoomListTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingRoomListTableViewController.swift; sourceTree = ""; }; + 04D344DA1FAEA773008F4ABF /* TintColorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TintColorViewController.swift; sourceTree = ""; }; + 04D344DC1FAEE2FF008F4ABF /* EquipmentsDefault.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = EquipmentsDefault.plist; sourceTree = ""; }; + 04D344DE1FAEE3BF008F4ABF /* EquipmentsListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EquipmentsListViewController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0474F8481F8E3F850043AEA0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F85C1F8E3F850043AEA0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F8671F8E3F850043AEA0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0474F8421F8E3F850043AEA0 = { + isa = PBXGroup; + children = ( + 0474F84D1F8E3F850043AEA0 /* MeetingRooms_01 */, + 0474F8621F8E3F850043AEA0 /* MeetingRooms_01Tests */, + 0474F86D1F8E3F850043AEA0 /* MeetingRooms_01UITests */, + 0474F84C1F8E3F850043AEA0 /* Products */, + ); + sourceTree = ""; + }; + 0474F84C1F8E3F850043AEA0 /* Products */ = { + isa = PBXGroup; + children = ( + 0474F84B1F8E3F850043AEA0 /* MeetingRooms_01.app */, + 0474F85F1F8E3F850043AEA0 /* MeetingRooms_01Tests.xctest */, + 0474F86A1F8E3F850043AEA0 /* MeetingRooms_01UITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 0474F84D1F8E3F850043AEA0 /* MeetingRooms_01 */ = { + isa = PBXGroup; + children = ( + 0474F84E1F8E3F850043AEA0 /* AppDelegate.swift */, + 0474F8501F8E3F850043AEA0 /* ViewController.swift */, + 0474F8521F8E3F850043AEA0 /* Main.storyboard */, + 04D344DC1FAEE2FF008F4ABF /* EquipmentsDefault.plist */, + 04D344DE1FAEE3BF008F4ABF /* EquipmentsListViewController.swift */, + 04D344DA1FAEA773008F4ABF /* TintColorViewController.swift */, + 0413D7371FAE0A1400DF618C /* ReserveRoomViewController.swift */, + 0413D7351FAE09E900DF618C /* ReservationListViewController.swift */, + 0413D7331FAE065400DF618C /* RoomInfoViewController.swift */, + 0413D72D1FADEF2E00DF618C /* DataCenter.swift */, + 0413D72F1FADF18E00DF618C /* BranchListViewController.swift */, + 0413D7311FADF1A600DF618C /* ServiceListViewController.swift */, + 0474F87C1F8E3FFF0043AEA0 /* MeetingRoomListTableViewController.swift */, + 0474F8551F8E3F850043AEA0 /* Assets.xcassets */, + 0474F8571F8E3F850043AEA0 /* LaunchScreen.storyboard */, + 0474F85A1F8E3F850043AEA0 /* Info.plist */, + ); + path = MeetingRooms_01; + sourceTree = ""; + }; + 0474F8621F8E3F850043AEA0 /* MeetingRooms_01Tests */ = { + isa = PBXGroup; + children = ( + 0474F8631F8E3F850043AEA0 /* MeetingRooms_01Tests.swift */, + 0474F8651F8E3F850043AEA0 /* Info.plist */, + ); + path = MeetingRooms_01Tests; + sourceTree = ""; + }; + 0474F86D1F8E3F850043AEA0 /* MeetingRooms_01UITests */ = { + isa = PBXGroup; + children = ( + 0474F86E1F8E3F850043AEA0 /* MeetingRooms_01UITests.swift */, + 0474F8701F8E3F850043AEA0 /* Info.plist */, + ); + path = MeetingRooms_01UITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0474F84A1F8E3F850043AEA0 /* MeetingRooms_01 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0474F8731F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01" */; + buildPhases = ( + 0474F8471F8E3F850043AEA0 /* Sources */, + 0474F8481F8E3F850043AEA0 /* Frameworks */, + 0474F8491F8E3F850043AEA0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MeetingRooms_01; + productName = MeetingRooms_01; + productReference = 0474F84B1F8E3F850043AEA0 /* MeetingRooms_01.app */; + productType = "com.apple.product-type.application"; + }; + 0474F85E1F8E3F850043AEA0 /* MeetingRooms_01Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0474F8761F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01Tests" */; + buildPhases = ( + 0474F85B1F8E3F850043AEA0 /* Sources */, + 0474F85C1F8E3F850043AEA0 /* Frameworks */, + 0474F85D1F8E3F850043AEA0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0474F8611F8E3F850043AEA0 /* PBXTargetDependency */, + ); + name = MeetingRooms_01Tests; + productName = MeetingRooms_01Tests; + productReference = 0474F85F1F8E3F850043AEA0 /* MeetingRooms_01Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 0474F8691F8E3F850043AEA0 /* MeetingRooms_01UITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0474F8791F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01UITests" */; + buildPhases = ( + 0474F8661F8E3F850043AEA0 /* Sources */, + 0474F8671F8E3F850043AEA0 /* Frameworks */, + 0474F8681F8E3F850043AEA0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0474F86C1F8E3F850043AEA0 /* PBXTargetDependency */, + ); + name = MeetingRooms_01UITests; + productName = MeetingRooms_01UITests; + productReference = 0474F86A1F8E3F850043AEA0 /* MeetingRooms_01UITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0474F8431F8E3F850043AEA0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = Mac; + TargetAttributes = { + 0474F84A1F8E3F850043AEA0 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + 0474F85E1F8E3F850043AEA0 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 0474F84A1F8E3F850043AEA0; + }; + 0474F8691F8E3F850043AEA0 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + TestTargetID = 0474F84A1F8E3F850043AEA0; + }; + }; + }; + buildConfigurationList = 0474F8461F8E3F850043AEA0 /* Build configuration list for PBXProject "MeetingRooms_01" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 0474F8421F8E3F850043AEA0; + productRefGroup = 0474F84C1F8E3F850043AEA0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0474F84A1F8E3F850043AEA0 /* MeetingRooms_01 */, + 0474F85E1F8E3F850043AEA0 /* MeetingRooms_01Tests */, + 0474F8691F8E3F850043AEA0 /* MeetingRooms_01UITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0474F8491F8E3F850043AEA0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0474F8591F8E3F850043AEA0 /* LaunchScreen.storyboard in Resources */, + 04D344DD1FAEE2FF008F4ABF /* EquipmentsDefault.plist in Resources */, + 0474F8561F8E3F850043AEA0 /* Assets.xcassets in Resources */, + 0474F8541F8E3F850043AEA0 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F85D1F8E3F850043AEA0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F8681F8E3F850043AEA0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0474F8471F8E3F850043AEA0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0413D7341FAE065400DF618C /* RoomInfoViewController.swift in Sources */, + 0474F8511F8E3F850043AEA0 /* ViewController.swift in Sources */, + 0474F87D1F8E3FFF0043AEA0 /* MeetingRoomListTableViewController.swift in Sources */, + 04D344DF1FAEE3BF008F4ABF /* EquipmentsListViewController.swift in Sources */, + 0413D7361FAE09E900DF618C /* ReservationListViewController.swift in Sources */, + 0413D72E1FADEF2E00DF618C /* DataCenter.swift in Sources */, + 0413D7301FADF18E00DF618C /* BranchListViewController.swift in Sources */, + 0413D7321FADF1A600DF618C /* ServiceListViewController.swift in Sources */, + 0474F84F1F8E3F850043AEA0 /* AppDelegate.swift in Sources */, + 0413D7381FAE0A1400DF618C /* ReserveRoomViewController.swift in Sources */, + 04D344DB1FAEA773008F4ABF /* TintColorViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F85B1F8E3F850043AEA0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0474F8641F8E3F850043AEA0 /* MeetingRooms_01Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0474F8661F8E3F850043AEA0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0474F86F1F8E3F850043AEA0 /* MeetingRooms_01UITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0474F8611F8E3F850043AEA0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0474F84A1F8E3F850043AEA0 /* MeetingRooms_01 */; + targetProxy = 0474F8601F8E3F850043AEA0 /* PBXContainerItemProxy */; + }; + 0474F86C1F8E3F850043AEA0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0474F84A1F8E3F850043AEA0 /* MeetingRooms_01 */; + targetProxy = 0474F86B1F8E3F850043AEA0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 0474F8521F8E3F850043AEA0 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 0474F8531F8E3F850043AEA0 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 0474F8571F8E3F850043AEA0 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 0474F8581F8E3F850043AEA0 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0474F8711F8E3F850043AEA0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 0474F8721F8E3F850043AEA0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 0474F8741F8E3F850043AEA0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 0474F8751F8E3F850043AEA0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 0474F8771F8E3F850043AEA0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MeetingRooms_01.app/MeetingRooms_01"; + }; + name = Debug; + }; + 0474F8781F8E3F850043AEA0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MeetingRooms_01.app/MeetingRooms_01"; + }; + name = Release; + }; + 0474F87A1F8E3F850043AEA0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01UITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MeetingRooms_01; + }; + name = Debug; + }; + 0474F87B1F8E3F850043AEA0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = MeetingRooms_01UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Hello.MeetingRooms-01UITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = MeetingRooms_01; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0474F8461F8E3F850043AEA0 /* Build configuration list for PBXProject "MeetingRooms_01" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0474F8711F8E3F850043AEA0 /* Debug */, + 0474F8721F8E3F850043AEA0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0474F8731F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0474F8741F8E3F850043AEA0 /* Debug */, + 0474F8751F8E3F850043AEA0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0474F8761F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0474F8771F8E3F850043AEA0 /* Debug */, + 0474F8781F8E3F850043AEA0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0474F8791F8E3F850043AEA0 /* Build configuration list for PBXNativeTarget "MeetingRooms_01UITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0474F87A1F8E3F850043AEA0 /* Debug */, + 0474F87B1F8E3F850043AEA0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0474F8431F8E3F850043AEA0 /* Project object */; +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..eb8c3d8 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/AppDelegate.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/AppDelegate.swift similarity index 59% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/AppDelegate.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/AppDelegate.swift index 7624358..8550bbb 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/AppDelegate.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/AppDelegate.swift @@ -1,9 +1,9 @@ // // AppDelegate.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 3. 13.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 10. 11.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit @@ -14,38 +14,36 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. - return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. dataCenter.save() } - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - - let userDefaultColor = NSUserDefaults.standardUserDefaults().integerForKey(TintColorKey) - guard let defaultColor = TintColor(rawValue: userDefaultColor)?.color else { + let userDefaultColor = UserDefaults.standard.integer(forKey: TintColorKey) + guard let defaultColor = TintColor(rawValue:userDefaultColor)?.color else { return } - applyTintColor(defaultColor) + applyTintColor(color: defaultColor) } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. dataCenter.save() } diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/AppIcon.appiconset/Contents.json b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 73% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/AppIcon.appiconset/Contents.json rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/AppIcon.appiconset/Contents.json index eeea76c..d8db8d6 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -64,6 +84,11 @@ "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/Contents.json b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/Contents.json similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/Contents.json rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/Contents.json diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/building_tab.imageset/Contents.json b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/building_tab.imageset/Contents.json similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/building_tab.imageset/Contents.json rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/building_tab.imageset/Contents.json diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/building_tab.imageset/building_tab.png b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/building_tab.imageset/building_tab.png similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/building_tab.imageset/building_tab.png rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/building_tab.imageset/building_tab.png diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/equipment_tab.imageset/Contents.json b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/equipment_tab.imageset/Contents.json similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/equipment_tab.imageset/Contents.json rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/equipment_tab.imageset/Contents.json diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/equipment_tab.imageset/equipment_tab.png b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/equipment_tab.imageset/equipment_tab.png similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/equipment_tab.imageset/equipment_tab.png rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/equipment_tab.imageset/equipment_tab.png diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/location.imageset/Contents.json b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/location.imageset/Contents.json similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/location.imageset/Contents.json rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/location.imageset/Contents.json diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/location.imageset/location.png b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/location.imageset/location.png similarity index 100% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Assets.xcassets/location.imageset/location.png rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Assets.xcassets/location.imageset/location.png diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/LaunchScreen.storyboard b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/LaunchScreen.storyboard similarity index 58% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/LaunchScreen.storyboard rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/LaunchScreen.storyboard index 2e721e1..f83f6fd 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/LaunchScreen.storyboard +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/LaunchScreen.storyboard @@ -1,22 +1,20 @@ - + - + + + - - - - - + - - + + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/Main.storyboard b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/Main.storyboard similarity index 50% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/Main.storyboard rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/Main.storyboard index 5958a44..41493bc 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Base.lproj/Main.storyboard +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Base.lproj/Main.storyboard @@ -1,208 +1,332 @@ - - + + + + + - - + + + - - + + - - - + + + - - + + - - + + - + - - + + - - + + + - + - + - + - - + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - + + + + + + - - - + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - - + - - + + - + + + + - + - + - + - - - + + + - + - - + + - - + + - - - - - - - - - - - - - - - + + - - + + - @@ -210,51 +334,51 @@ - + - - + + - - + + - - - + + - - + + - @@ -262,20 +386,20 @@ - + - - + + - - + + - @@ -285,459 +409,294 @@ - - + + - - + + - + - + - + - + - - - + + + - + - - + + - - + + - - - - - - - - - - - - - - - + + - - + + - - - - - - - - - - - - - - - - + + - - + + - - - - - - - - - - - - - - - + + - - + + - - - - - - + + + - - + + - - + + - - - - - - - - - + + - - + + - + - + - + - - - - - + + + + + - + - + - - + + - - - - - + + + - - + - + - + - - + + - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - + + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + + - - + + - - + + - @@ -745,39 +704,45 @@ - - + + - - + + - + - + - + - - + + - + - - + + - - + + - + + + + + + + - - + + - + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/BranchListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/BranchListViewController.swift new file mode 100644 index 0000000..c56f1ae --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/BranchListViewController.swift @@ -0,0 +1,110 @@ +// +// BranchListViewController.swift +// MeetingRooms_01 +// +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import UIKit + +class BranchListViewController: UITableViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem + self.navigationController?.isToolbarHidden = true + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func locationTurnOn(_ sender: Any) { + let locationAlert = UIAlertController(title: "위치 정보 요청", message: "위치 정보를 기반으로 가까운 지점을 자동으로 선택할 수 있습니다. 또는 지도앱에서 지점의 위치 정보를 제공해 드립니다. 선택하신 기능이 계속 제공됩니다. 환경설정에서 제공되는 기능을 변경할 수 있습니다.", preferredStyle: .actionSheet) + let locationAction = UIAlertAction(title: "위치정보 켜기", style: .default, handler: { (action:UIAlertAction) -> Void in print ("위치정보 켜기 선택")}) + let openMapAction = UIAlertAction(title: "지도앱에서 열기", style: .default, handler: { (action:UIAlertAction) -> Void in + print ("지도앱에서 열기 선택")}) + + locationAlert.addAction(locationAction) + locationAlert.addAction(openMapAction) + self.present(locationAlert, animated: true, completion: nil) + +} + + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + let rowCount = dataCenter.branches.count + return rowCount + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "BranchCell", for: indexPath) + + let branch = dataCenter.branches[indexPath.row] + cell.textLabel?.text = branch.name + + return cell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + // Delete the row from the data source + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "ServiceSegue" { + if let destinaion = segue.destination as? ServiceListViewController, + let selectedIndex = self.tableView.indexPathForSelectedRow?.row { + destinaion.branch = dataCenter.branches[selectedIndex] as Branch + } + } + } +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/DataCenter.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/DataCenter.swift similarity index 52% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/DataCenter.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/DataCenter.swift index a547081..eba3b7f 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/DataCenter.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/DataCenter.swift @@ -1,28 +1,28 @@ // // DataCenter.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 4. 5.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. // import Foundation - -let dataCenter:DataCenter = DataCenter() let fileName = "BranchData.brch" +let dataCenter:DataCenter = DataCenter() class DataCenter { var branches:[Branch] = [] var filePath:String { get{ - let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! + let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! return documentDirectory + fileName - }} + }} init() { - if NSFileManager.defaultManager().fileExistsAtPath(self.filePath) { + + if FileManager.default.fileExists(atPath: self.filePath) { //read - if let unarchArray = NSKeyedUnarchiver.unarchiveObjectWithFile(self.filePath) as? [Branch] { + if let unarchArray = NSKeyedUnarchiver.unarchiveObject(withFile: self.filePath) as? [Branch] { branches += unarchArray } } else { @@ -30,21 +30,20 @@ class DataCenter { branches += defaultData() } - } - func defaultData() -> Array { + + func defaultData() -> [Branch] { let banksyRoom = MeetingRoom(name: "Banksy", capacity: 4) let kahloRoom = MeetingRoom(name: "Kahlo", capacity: 8) let riveraRoom = MeetingRoom(name: "Rivera", capacity: 8) let picassoRoom = MeetingRoom(name: "Picasso", capacity: 10) - let vehicleService = Service(name: "차량예약") let meetingRoomService = Service(name: "회의실예약") let visitorService = Service(name: "방문자예약") let deskService = Service(name: "데스크예약") - meetingRoomService.item = [banksyRoom, kahloRoom, riveraRoom, picassoRoom] + meetingRoomService.items = [banksyRoom, kahloRoom, riveraRoom, picassoRoom] let pangyoBranch = Branch(name: "판교점") let samsungBranch = Branch(name: "삼성점") @@ -54,16 +53,15 @@ class DataCenter { let anamBranch = Branch(name: "안암점") pangyoBranch.services = [vehicleService, meetingRoomService, visitorService, deskService] - let branchArray = [samsungBranch, pangyoBranch, yeoksamBranch, sinrimBranch, songdoBranch, anamBranch] - return branchArray + branches += [pangyoBranch, samsungBranch, yeoksamBranch, sinrimBranch, songdoBranch, anamBranch] + return branches } - func save(){ + func save() { NSKeyedArchiver.archiveRootObject(self.branches, toFile: self.filePath) } } - class Branch:NSObject, NSCoding { let name:String var services:[Service]? @@ -71,40 +69,35 @@ class Branch:NSObject, NSCoding { init(name:String) { self.name = name } - required init?(coder aDecoder: NSCoder) { - self.name = aDecoder.decodeObjectForKey("name") as! String - self.services = aDecoder.decodeObjectForKey("services") as? [Service] + self.name = aDecoder.decodeObject(forKey: "name") as! String + self.services = aDecoder.decodeObject(forKey: "services") as? [Service] } - - func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(self.name, forKey: "name") - aCoder.encodeObject(self.services, forKey: "services") + func encode(with aCoder: NSCoder) { + aCoder.encode(self.name, forKey: "name") + aCoder.encode(self.services, forKey: "services") } + } - class Service:NSObject, NSCoding { let name:String - var item:[MeetingRoom]? + var items:[MeetingRoom]? - init (name:String){ + init(name:String) { self.name = name } required init?(coder aDecoder: NSCoder) { - self.name = aDecoder.decodeObjectForKey("name") as! String - self.item = aDecoder.decodeObjectForKey("item") as? [MeetingRoom] + self.name = aDecoder.decodeObject(forKey: "name") as! String + self.items = aDecoder.decodeObject(forKey: "items") as? [MeetingRoom] } - - func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(self.name, forKey: "name") - aCoder.encodeObject(self.item, forKey: "item") + func encode(with aCoder: NSCoder) { + aCoder.encode(self.name, forKey: "name") + aCoder.encode(self.items, forKey: "items") } - } - class MeetingRoom:NSObject, NSCoding { let name:String let capacity:Int @@ -116,20 +109,18 @@ class MeetingRoom:NSObject, NSCoding { } required init?(coder aDecoder: NSCoder) { - self.name = aDecoder.decodeObjectForKey("name") as! String - self.capacity = aDecoder.decodeIntegerForKey("capacity") - self.reservations = aDecoder.decodeObjectForKey("reservations") as? [Reservation] + self.name = aDecoder.decodeObject(forKey: "name") as! String + self.capacity = aDecoder.decodeInteger(forKey: "capacity") + self.reservations = aDecoder.decodeObject(forKey: "reservations") as? [Reservation] } - func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(self.name, forKey: "name") - aCoder.encodeInteger(self.capacity, forKey: "capacity") - aCoder.encodeObject(self.reservations, forKey: "reservations") + func encode(with aCoder: NSCoder) { + aCoder.encode(self.name, forKey: "name") + aCoder.encode(self.capacity, forKey: "capacity") + aCoder.encode(self.reservations, forKey: "reservations") } } - - class Reservation:NSObject, NSCoding { var hostName:String var date:NSDate @@ -145,21 +136,19 @@ class Reservation:NSObject, NSCoding { self.catering = false } - required init?(coder aDecoder: NSCoder) { - self.hostName = aDecoder.decodeObjectForKey("hostName") as! String - self.date = aDecoder.decodeObjectForKey("date") as! NSDate - self.attendees = aDecoder.decodeIntegerForKey("attendees") - self.equipments = aDecoder.decodeObjectForKey("equipments") as! [String] - self.catering = aDecoder.decodeBoolForKey("catering") + self.hostName = aDecoder.decodeObject(forKey: "hostName") as! String + self.date = aDecoder.decodeObject(forKey: "date") as! NSDate + self.attendees = aDecoder.decodeInteger(forKey: "attendees") + self.equipments = aDecoder.decodeObject(forKey: "equipments") as! [String] + self.catering = aDecoder.decodeBool(forKey: "catering") } - func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(self.hostName, forKey: "hostName") - aCoder.encodeObject(self.date, forKey: "date") - aCoder.encodeInteger(self.attendees, forKey: "attendees") - aCoder.encodeObject(self.equipments, forKey: "equipments") - aCoder.encodeBool(self.catering, forKey: "catering") + func encode(with aCoder: NSCoder) { + aCoder.encode(self.hostName, forKey: "hostName") + aCoder.encode(self.date, forKey: "date") + aCoder.encode(self.attendees, forKey: "attendees") + aCoder.encode(self.equipments, forKey: "equipments") + aCoder.encode(self.catering, forKey: "catering") } } - diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsDefault.plist b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsDefault.plist similarity index 95% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsDefault.plist rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsDefault.plist index 5962ab0..880aae5 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsDefault.plist +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsDefault.plist @@ -16,7 +16,7 @@ name - HP DL320e + HP DL320De amount 7 diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsListViewController.swift similarity index 60% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsListViewController.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsListViewController.swift index b7dc7ce..435af9f 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/EquipmentsListViewController.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/EquipmentsListViewController.swift @@ -1,18 +1,18 @@ // // EquipmentsListViewController.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 4. 20.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 11. 5.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit - let EquipmentFileName = "EquipmentsDefault" -class EquipmentsListViewController: UITableViewController { - var equipments:Array = [] +class EquipmentsListViewController: UITableViewController { + var equipments:Array = [] + override func viewDidLoad() { super.viewDidLoad() @@ -20,17 +20,16 @@ class EquipmentsListViewController: UITableViewController { // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem() + // self.navigationItem.rightBarButtonItem = self.editButtonItem - guard let equipmentURL = NSBundle.mainBundle().URLForResource(EquipmentFileName, withExtension: "plist") else { + guard let equipmentURL = Bundle.main.url(forResource: EquipmentFileName, withExtension: "plist") else { print("No File") return } - if let equipmentsArray = NSArray(contentsOfURL: equipmentURL){ - print(equipmentsArray) - equipments += Array(equipmentsArray) + if let equipmentArray = NSArray(contentsOf: equipmentURL) { + print(equipmentArray) + equipments += Array(equipmentArray) } - } override func didReceiveMemoryWarning() { @@ -40,23 +39,25 @@ class EquipmentsListViewController: UITableViewController { // MARK: - Table view data source - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return equipments.count } - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("EquipmentCell", forIndexPath: indexPath) + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "EquipmentCell", for: indexPath) + // Configure the cell... guard let equipment = equipments[indexPath.row] as? [String:AnyObject] else { return cell } - + if let name = equipment["name"] as? String { cell.textLabel?.text = name } @@ -66,10 +67,11 @@ class EquipmentsListViewController: UITableViewController { return cell } + /* // Override to support conditional editing of the table view. - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } @@ -77,11 +79,11 @@ class EquipmentsListViewController: UITableViewController { /* // Override to support editing the table view. - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == .Delete { + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { // Delete the row from the data source - tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) - } else if editingStyle == .Insert { + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } @@ -89,14 +91,14 @@ class EquipmentsListViewController: UITableViewController { /* // Override to support rearranging the table view. - override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. - override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } @@ -106,7 +108,7 @@ class EquipmentsListViewController: UITableViewController { // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Info.plist b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Info.plist similarity index 95% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Info.plist rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Info.plist index 40c6215..16be3b6 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/Info.plist +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/MeetingRoomListTableViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/MeetingRoomListTableViewController.swift new file mode 100644 index 0000000..ba30a75 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/MeetingRoomListTableViewController.swift @@ -0,0 +1,101 @@ +// +// MeetingRoomListTableViewController.swift +// MeetingRooms_01 +// +// Created by Mac on 2017. 10. 11.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import UIKit + +class MeetingRoomListTableViewController: UITableViewController { + + var service:Service? + + override func viewDidLoad() { + super.viewDidLoad() + self.title = service?.name + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let rowCount = service?.items?.count else { + return 0 + } + return rowCount + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) + guard let meetingRoom = service?.items?[indexPath.row] else { + return cell + } + + cell.textLabel!.text = meetingRoom.name + cell.detailTextLabel!.text = String(meetingRoom.capacity) + + return cell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + // Delete the row from the data source + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "ReservationSegue" { + guard let destination = segue.destination as? ReservationListViewController, let selectedIndex = self.tableView.indexPathForSelectedRow?.row , let meetingRoom = service?.items?[selectedIndex] else { + return + } + destination.meetingRoom = meetingRoom + } + } + + +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReservationListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReservationListViewController.swift similarity index 59% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReservationListViewController.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReservationListViewController.swift index 12b6314..f31fbcf 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/ReservationListViewController.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReservationListViewController.swift @@ -1,15 +1,15 @@ // // ReservationListViewController.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 4. 17.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit class ReservationListViewController: UITableViewController { - + var meetingRoom:MeetingRoom? var newReservation:Reservation? @@ -20,35 +20,35 @@ class ReservationListViewController: UITableViewController { // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem() + // self.navigationItem.rightBarButtonItem = self.editButtonItem } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - - func addNewItem(reservation:Reservation) { - if (self.meetingRoom?.reservations?.append(reservation)) == nil { - self.meetingRoom?.reservations = [reservation] - } - dataCenter.save() - - self.tableView.reloadData() - - } - @IBAction func unwindToReserveList(segue:UIStoryboardSegue) { + @IBAction func unwindToReservationList(segue:UIStoryboardSegue) { print("unwind") } + func addNewItem(reservaion:Reservation) { + if (self.meetingRoom?.reservations?.append(reservaion)) == nil { + self.meetingRoom?.reservations = [reservaion] + } + dataCenter.save() + self.tableView.reloadData() + } + // MARK: - Table view data source - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + override func numberOfSections(in tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections return 1 } - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows guard let rowCount = meetingRoom?.reservations?.count else { return 0 } @@ -56,21 +56,22 @@ class ReservationListViewController: UITableViewController { } - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("ReservationCell", forIndexPath: indexPath) + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "ReservationCell", for: indexPath) guard let reservation = meetingRoom?.reservations?[indexPath.row] else { return cell } cell.textLabel?.text = reservation.date.description cell.detailTextLabel?.text = reservation.hostName + return cell } /* // Override to support conditional editing of the table view. - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } @@ -78,11 +79,11 @@ class ReservationListViewController: UITableViewController { /* // Override to support editing the table view. - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == .Delete { + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { // Delete the row from the data source - tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) - } else if editingStyle == .Insert { + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } @@ -90,14 +91,14 @@ class ReservationListViewController: UITableViewController { /* // Override to support rearranging the table view. - override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. - override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } @@ -107,7 +108,7 @@ class ReservationListViewController: UITableViewController { // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReserveRoomViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReserveRoomViewController.swift new file mode 100644 index 0000000..40c6e53 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ReserveRoomViewController.swift @@ -0,0 +1,153 @@ +// +// ReserveRoomViewController.swift +// MeetingRooms_01 +// +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import UIKit + +class ReserveRoomViewController: UITableViewController { + @IBOutlet weak var hostNamefield: UITextField! + @IBOutlet weak var datePicker: UIDatePicker! + @IBOutlet weak var attendeesField: UITextField! + @IBOutlet weak var cateringSwitch: UISwitch! + + @IBOutlet weak var equipmentField: UITextField! + override func viewDidLoad() { + super.viewDidLoad() + + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func newReservation() -> Reservation? { + let reservation = Reservation() + let host = hostNamefield.text! + if host.isEmpty { + return nil + } + reservation.hostName = host + reservation.date = datePicker.date as NSDate + if let equipmentArray = equipmentField.text?.characters.split(separator: ",").map(String.init) { + reservation.equipments = equipmentArray + } + reservation.catering = cateringSwitch.isOn + return reservation + } + + @IBAction func cancelReservation(_ sender: Any) { + self.dismiss(animated: true, completion: nil) + } + @IBAction func makeReservation(_ sender: Any) { + guard let reservation = newReservation() else { + self.dismiss(animated: true, completion: nil) + return + } + + switch self.presentingViewController { + case let tabBarC as UITabBarController: + if let navigationC = tabBarC.selectedViewController as? UINavigationController, let reservationListVC = navigationC.topViewController as? ReservationListViewController { + reservationListVC.addNewItem(reservaion: reservation) + } + case let navigationC as UINavigationController: + if let reservationListVC = navigationC.topViewController as? ReservationListViewController { + reservationListVC.addNewItem(reservaion: reservation) + } + case let reservationListVC as ReservationListViewController: + reservationListVC.addNewItem(reservaion: reservation) + default: + print("Cannot find ReservationListViewController") + break + } + self.dismiss(animated: true, completion: {}) + } + + func prepareForSegue(segue:UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "ReserveDone" { + guard let reservation = newReservation(), let reservationListVC = segue.destination as? ReservationListViewController else { + return + } + reservationListVC.addNewItem(reservaion: reservation) + } + + +/* + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 0 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 0 + } +*/ + /* + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) + + // Configure the cell... + + return cell + } + */ + + /* + // Override to support conditional editing of the table view. + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + // Delete the row from the data source + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/RoomInfoViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/RoomInfoViewController.swift similarity index 58% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/RoomInfoViewController.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/RoomInfoViewController.swift index c9c33b9..a58bf64 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/RoomInfoViewController.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/RoomInfoViewController.swift @@ -1,9 +1,9 @@ // // RoomInfoViewController.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 4. 16.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit @@ -17,34 +17,36 @@ class RoomInfoViewController: UITableViewController { // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem() + // self.navigationItem.rightBarButtonItem = self.editButtonItem } - override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - - @IBAction func dismissModal(sender: AnyObject) { - self.dismissViewControllerAnimated(true, completion: nil) -} - + + + @IBAction func modalDismiss(_ sender: Any) { + self.dismiss(animated: true, completion: nil) + } + + +/* // MARK: - Table view data source - /* - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + + override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 0 } - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return 0 - }*/ - + } +*/ /* - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) // Configure the cell... @@ -54,7 +56,7 @@ class RoomInfoViewController: UITableViewController { /* // Override to support conditional editing of the table view. - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } @@ -62,11 +64,11 @@ class RoomInfoViewController: UITableViewController { /* // Override to support editing the table view. - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == .Delete { + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { // Delete the row from the data source - tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) - } else if editingStyle == .Insert { + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } @@ -74,14 +76,14 @@ class RoomInfoViewController: UITableViewController { /* // Override to support rearranging the table view. - override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. - override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } @@ -91,7 +93,7 @@ class RoomInfoViewController: UITableViewController { // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ServiceListViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ServiceListViewController.swift new file mode 100644 index 0000000..27749fe --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ServiceListViewController.swift @@ -0,0 +1,106 @@ +// +// ServiceListViewController.swift +// MeetingRooms_01 +// +// Created by Mac on 2017. 11. 4.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import UIKit + +class ServiceListViewController: UITableViewController { + + var branch:Branch? + + override func viewDidLoad() { + super.viewDidLoad() + + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem + + self.title = branch?.name + self.navigationController?.isToolbarHidden = false + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let rowCount = branch?.services?.count else { + return 0 + } + return rowCount + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "ServiceCell", for: indexPath) + + guard let service = branch?.services?[indexPath.row] else { + return cell + } + cell.textLabel?.text = service.name + return cell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + // Delete the row from the data source + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "MeetingRoomSegue" { + guard let destination = segue.destination as? MeetingRoomListTableViewController, let selectedIndex = self.tableView.indexPathForSelectedRow?.row, let service = branch?.services?[selectedIndex] else { + return + } + destination.service = service + } + } +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/TintColorViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/TintColorViewController.swift similarity index 50% rename from SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/TintColorViewController.swift rename to SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/TintColorViewController.swift index bead065..4619650 100644 --- a/SampleCodes/MeetingRoomsDynamic/MeetingRoomsDynamic/TintColorViewController.swift +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/TintColorViewController.swift @@ -1,49 +1,57 @@ // // TintColorViewController.swift -// MeetingRoomsDynamic +// MeetingRooms_01 // -// Created by Lingostar on 2016. 4. 20.. -// Copyright © 2016년 CodersHigh. All rights reserved. +// Created by Mac on 2017. 11. 5.. +// Copyright © 2017년 Mac. All rights reserved. // import UIKit enum TintColor:Int { - case Blue=0, Red, Green, Purple + case Blue = 0, Red, Green, Purple - var color:UIColor {get{ + var color:UIColor { get{ switch self { case .Blue: - return UIColor.blueColor() + return UIColor.blue case .Red: - return UIColor.redColor() + return UIColor.red case .Green: - return UIColor.greenColor() + return UIColor.green case .Purple: - return UIColor.purpleColor() + return UIColor.purple } - }} + } + } } -let TintColorKey = "TintColor" -func applyTintColor(color:UIColor){ - guard let window = UIApplication.sharedApplication().keyWindow else { +let TintColorKey = "TintColor" +func applyTintColor(color:UIColor) { + guard let window = UIApplication.shared.keyWindow else { return } window.tintColor = color } class TintColorViewController: UIViewController { - - @IBOutlet weak var tintColorSegment: UISegmentedControl! + @IBOutlet weak var tintColorSeg: UISegmentedControl! + @IBAction func tintColocChanged(_ sender: Any) { + let selectedIndex = self.tintColorSeg.selectedSegmentIndex + UserDefaults.standard.integer(forKey: TintColorKey) + + guard let changedColor = TintColor(rawValue: selectedIndex)?.color else { + return + } + applyTintColor(color: changedColor) + } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. - - let userDefaultColor = NSUserDefaults.standardUserDefaults().integerForKey(TintColorKey) - self.tintColorSegment.selectedSegmentIndex = userDefaultColor + let userDefaultColor = UserDefaults.standard.integer(forKey: TintColorKey) + self.tintColorSeg.selectedSegmentIndex = userDefaultColor } override func didReceiveMemoryWarning() { @@ -51,22 +59,12 @@ class TintColorViewController: UIViewController { // Dispose of any resources that can be recreated. } - @IBAction func tintColorChanged(sender: AnyObject) { - let selectedIndex = self.tintColorSegment.selectedSegmentIndex - NSUserDefaults.standardUserDefaults().setInteger(selectedIndex, forKey: TintColorKey) - guard let changedColor = TintColor(rawValue: selectedIndex)?.color else { - return - } - applyTintColor(changedColor) - } - - /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ViewController.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ViewController.swift new file mode 100644 index 0000000..bad5b9e --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// MeetingRooms_01 +// +// Created by Mac on 2017. 10. 11.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/Info.plist b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/MeetingRooms_01Tests.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/MeetingRooms_01Tests.swift new file mode 100644 index 0000000..a327823 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01Tests/MeetingRooms_01Tests.swift @@ -0,0 +1,36 @@ +// +// MeetingRooms_01Tests.swift +// MeetingRooms_01Tests +// +// Created by Mac on 2017. 10. 11.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest +@testable import MeetingRooms_01 + +class MeetingRooms_01Tests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/Info.plist b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/MeetingRooms_01UITests.swift b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/MeetingRooms_01UITests.swift new file mode 100644 index 0000000..ac12e68 --- /dev/null +++ b/SampleCodes/MeetingRoomsDynamic/MeetingRooms_01UITests/MeetingRooms_01UITests.swift @@ -0,0 +1,36 @@ +// +// MeetingRooms_01UITests.swift +// MeetingRooms_01UITests +// +// Created by Mac on 2017. 10. 11.. +// Copyright © 2017년 Mac. All rights reserved. +// + +import XCTest + +class MeetingRooms_01UITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/SampleCodes/MeetingRoomsDynamic/building.png b/SampleCodes/MeetingRoomsDynamic/building.png deleted file mode 100644 index 6b1aec01dedbf7a82b98c44f45fc9324939e2b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11950 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 Hdr$rcDdq8c diff --git a/SampleCodes/MeetingRoomsDynamic/equipment.png b/SampleCodes/MeetingRoomsDynamic/equipment.png deleted file mode 100644 index b9132b8c6e94ea59e6afa2438abff0ef94e078a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17736 zcmb`u1yohh_b$2*9TEb9fCvT%h#;kc5~6e|-JnR9lF~;oK|*QimPWcm1*8Q8q>+>^ z>3VbXd;dG$8+VL%?|Apm7-w)|@3r?{YsNRf`K@;kl%&Z>7)THVA(NH4uYw>r@D>Ll zB7lGYp8wi|f5cB^v>gzHlp1|ukWVpZ5rjn1;@-Un56tZx?HtVQp0dc^yT|g>-pLY#(Nl zED<4n?o+-g5)kRNA}eAU7yBuFTNSi5>iTtqU-ki~zpqWH+~ zjF4eEN>)#YNa+9iC_IM`}@#5qta zm_pnL!A41NwIM9GaFBcFsoQZ`6mS!+ch`<*7(RVfCWArhTEp5S^ zPh6PzYW+px5giAmDe=_Bn26|0)H1WU3LU2qgkiU<{^*ui@a)XgpBd9x>y>{ENk>+z zb{9o2tc@L2y~n{rD3v-_1`VgD`*5E&Ve*}7tul0xK@G%wY*(Luh&VxqjXuPylXXvl39dG<*>DyJ^l_wd;xTjyMr zz}Z$j30~Xn*-J-Fue=WfIl3kUzUXnC@mte+SN7ndVv}pR%7^MBHoR+It4l4+y210H5nNf`ruW28mzAAng$; zlL%7v_pILMP&$Q1A_Tdg@Pae{F5#(qn(R9An0ltFIy#(31oy>HU9P)BDM2uWJx7vw zHvBHVTAlE3yyARZhJ@3f{!kXx^WGwx9jDTJvGA0R!02q;*RxfxiSh3KAfkSBLHO#+NBqQ(@6B z5Sh#5%^#2cs_}!gv^KS8F9aeGT#cv>&V(9I6vS~eUm{g z;Pi>LJ(~7jYs$6c-k+Z=%q+IedFC7|h(~3O0Q((rpCqJF4d@8@HTGK-{$v{TpO+~V{&^Pz<*OgKy<%qwg*Q%&7L zU98tNlTjFeKg6XY!ZyB$)1snghinJ)}T7CKF^XXReiVxq-le=V-uavPZzcHH>d`>57nr(OP zakjvy$*|R(M~^M|hEl$#G)&cSw1--KGOg$;>Tzsq`@uDw{X4sPF;J*C#wzYn%|O-A zLBOk2$(RN?{~P{I;e+8Gt@z=J;oI4f8loDm8k-vZ*|L3l3tS5}eVWz}7&W6$MGHr_ zmVC~M&iU>fZ8JtQK@-H$&9SL!JIK3uut>7_X^~(_XzS4y>z2({CsW%wDyF{Mj<-GR z9i7^ot)Escr2G;1mhnB~+nlBuqgkRu?1ms+ntX68RfKZ{ovKZ`U%G9)TWi=f!*WG; zanELQbY=8#&VbFYkv5SA&#Zk#?r6ql{cj>GcmJ(!YfU_Bn~Y75PXD?QJj-L?Y@lth zUwvM=ForFz@4C&8q3^om)vfME!lEK3dmVGQqK%?B@ow>NYSL;hj)~M<^6K-7@*+Hl z+rPcndKk1*`^R;ic1;Q22vd)l##Fyxcu|OJh0BZ=g_lYwh#!DoNx*YT^o+zQVlr)J z`w+W2x^>1~WBy??u1{TOT8LuL=rHbGZ(~z9-*-CjbtlmnrI%gWuEJbf3DMheY3sLT z%og-fbi1B39GrZa-185MR2`o=ZgcfzPigO)RR^vGWxOxHJ!Dy8?`)QBX{};yyck`E zEz2x>@%+t>EV~sGPye+XJR$Nwr-8w z_Pn=e{#seesga*pS>>wh2l|iYmo^kN?)QymcMd!oxF!@D6B?7OLS_+ObhZC_DSN51 z>D8+tWK*s)HZ6=HZ(6peF6}yO44tulrO=gJq>}r9oK}J7^VR3NXLX;K$yCee{Nf)o zJ(}OWMCwE9Q5~HBpe(=eciD68wegF!l9jZV{8i~(xOw$eDxN&ISnc*~HE%5lKYTEu zrJ}xW={md~sN&n5ntJc5kETFaMrd=ZZSFsva^o|P!k(zFSVr{fYIt+fg&Af)&HkLb zlP^^^Goh(u*z2+BYBM-EDp%UFv>>yPvS6FNtzDZZS8aK>_vh>fN4fU8@W-( zL^sRL!1ki{mUdjhM}kYbZ6(=5>xnm#x7=dA^;)3$rrXC#Q>F=IvTjMqq+w2N{>T#$RJJK>h(%7Ue%o%L{DZEXRu zjmnLH^D@Fur=ziUgV9T$T#BFSaFTz$J6(TeEX~7x^1ySV*$h_zHcMhh_4n5=5&aNP!1?f3T{cAVt`WIGyP7})tE$BGrw=CK;pI6NqBBTLYQh=;I{xR+qpKm!r)H{n%sS%^n{xFl zAAkM!O^k$?_)BSFVOHw5e6}0mw1}LXoONMAfsU!Esg%d@;kGgj9i0pB*;7YFRQcyf zUS0gw)Rdm!FxzoOLPDaz*T<(IHYSF%-R3qwKmWZeN-?*T*+N_;@84gfmgFthEw#FLRHUt0Q#e^O+3jpsh~j6E&x z^&#Yej*jL2Tzb6d+H{0rjjpclP*e%BbM5BM(&}f=o-GiNF@#Qyk0-cO4h6@@uS7&f zmQ}%Dli{Iuu}*AOm-*J)q{wsU&Ut8YNA!0|QX*a&dU{;P|9X^-otKAqZT0o_ktJkR zGbT1x^$i8{QG=?oNU?URiu%|}znIg!THWt2#+vh+d$}%qE}w4LeDZcb{pk7gottv0 z>uj+vFXM`%suR>BU!V`?(9ia%5#?h1*I{VT@)wVr%?qujxEAFc=M4$1T&e87vyO zWzrJr?XvirciXFGIa58WkxRE^(e*AR&hheDzNqY}E@|fWJ=fEZ?6Wj-*5}x>xsj>q z=>hMZKW}{%Ghnmx|BL%{{%n;AGYoxn?UT*TTrgptLYM z>!L){5c>D;-zn#%!Pu0-{2e6UwEfe#No#n{>}wH(AtWS3bx_x?T9BWUlk?E4D$XEJ z^D-M7cV~M$lgUJ4@%i)T8%pU;6X4@B6&DwqoW8(y1<|YZ(!XKc_+FNtp1zPn5W9cb z?EBl(hVPlhyb|@e^XwMsD!mRX7JhuVBvx%dEvImaAbLZL=b{2JDe3L;@$tHg5|MVu zkLKoQF`}M(bUHaD%q9d+Yw_{$JZ@O^WoH-|7-%x=7c0e!j(Gk1+hxVbz#zf6Ura;N zFb!Us_AV)sik`l_v!UUYvNWSezg%Zr~;8zZBgyLgzvhm>lO0Ag4ojV6I#^jGbdVXZwaGGCOm`;`o*!#CQQ234cXRhVp;h{IB$ZU5)bpInTL z(Nfw6Qxg;R`iT#IG2M2y9>*OuRCjVJ?$1z7zv!|w7?$t4G4n|5XvbKW5&qypt=q=W zE?<61AfDbc088uT2sSGlN{ub|4+w}A1!L3>5Ui;;3J!qbrkg{qP`5ohURqir^)|R4 zc@AbePrJ}`x{U;NqVF;kw@u$!n~^2DW0AO~=m7Z7XE`JD*HYQ1JAO z9#NEnMt8ZxY;spuS2II^X;6Cl6@MbusW>m3$Qw3;=1Tjx`PbuwgoF&hYR@nUJMJX% z8q_s6XB5=bj4to2O`3Yr7j>CiyKT<*dY==rPZ@hn#yCNK{?6~Ls;c2{=z;K*sS0O0 zkb~TK&HXE?5=giVgii0(dcr)Hl~Ivm-p2kp#}*7OfrrzTAo3gc2EhYqhP|ZjrYpq; zet8>=un>Lq&f74|H>%gfiP*#B8$mQTp6gESbeaD(_r&;pEnFe7(5!Rx$()n@vu8ro zFcr!)4O6HMa?tqcm=GZ{}|f48zOy|xwx#?zP=*8 z^85Gi$OD1x(Q0?*c$l#BR@u=xIZM3>2?>{y*wY~VEiNy6g$+DO#f&%58F~Z|?j!k9 zlZ^rUni3K|&2~>r1sF^&Ne3SM`#0C~Ov6CJW`Ao*d6XR2%gbvvQeA@z>C4upu6ok^ zkxP!Cj-mNU!6HNi5xTQyBaP?3K)#cR_deQ9^+Mw60^j8=4X^ldpmC-@Ud?lO0V6hK8q z^|9lk#Ku$UZA|1H*Y)WBTzy8Fazv|ee%|u<^=kr~2yXqrC^zfdw<{}f3CZ6FKi0Rh zwEP7Lnrx`reVd>0hV|Rl*472^goNjCNk3v-Qx5_o7)I2tdQ$_Fio=3$Uw+5o+iNmq zv4hobyJ_b%^ZKv4Z7;{#!{jWh?MCPrl97{(UiN!jAeB6jtdXUC-<%thkeS(H`ZM9K zdrNDpy9y_wa+-#w=<)9QbZ3;?Fg_`5RTab-SG64%a;Y0PSixLxalioJ{WUc;vl%V8 zrx37{X|co~>E^N*aF--2L2{ z8V6fj+jIej_VW*ERDFDXDFy}xzS!2`9X&lgKGER64?$~BQVvhtFEcA^=((#alig5B zj%=QpCTCdb*3!_;k0fJ4u}ZUEGi_0;p`oEW0gN}v#k`L^u=PgyoB#fC6#)84mSDSs zdy=K6LX_jOv$9AN?jtEJLqq$mIl86feA9x9WMpLPk&%(HIyqa!oE~8#sIXysX5#ldI4VKJ@dCKx$CCw@KdK}&p0423^;K*MwlV6L?!?`T64i46kHLR z*!cLdKE>!8A|@@8=3`#_HovasRoMs6-(bjrU&@C{S#7~Sxc!M%SdeVJ@`43O2tg_g z$WETJ=oSK@-bklD1U=JRXd~0!F;|)E(smI4p zpBR#R=G0;^JKDCkxttd+{2{zc=@H3?tQrE`_!%eS?gkj{uY%yr-sZxa&e+@Aq?!BU z>@d=*yl@S%?}qOiw<5yA$}Ng@HjAzL&kH-uDD3a;?LDyiUF$ODS(?XTcgk_Dn|182 zFM$np%En9aLbi}*Ibr9;$TQT`g>&z&#Qiq4vopMuflx9rdFE$ka<-_rH1_s7)k-A` zvHLyN0hp5}k@%B8=LKOp_|DvrU2TAjyu81t+duREPoF*!$&Ww%us5?43GKh(Z zvk2jcFkexlIDjTGnt28yrVD*JzVq|*T()b`3T&;Tg=We;baWB+ssX!y-Y_c-6qvNu zMlqSXVT-3ML9Dbv5!ECN}P@2H+!w!-8eKbVDkRF$le&U z$7=mA2(6PPB_(7E+I4pZhK9ySC@93b)0N{x3knJ<4h}q0S%~7o3l61{yR!5voil>& ztpAWy4RD=oB%3WND*Dq#Uf5d%=KKvpw)EofFO$uKgF2}}L7kGSx%j;P$aTBXsyVRc zzvdi_%M%j?-bV+!dH)vr?Fh&AFs*<7{?+PDmJYH5$aA`6!AUsm?6g~$pVyh0n{ypV>U?@OKq@gM<$DQ0 ze>!|p?ZdGOr-gQ?PdpnSZj$s+NEGCMDNJ2wHLtb8Z2ZaR!gx+=QuU@}4 z&DHuc0SMdm2USTa%))eUmS(krpg{~>7Io*FfR!%5F= z?y=F*A$$XstE+1zM1v=`P#Y<8>6NXv7ZmVO6jC4! z4GsEj)%j~{YYSygY(~{E7rV^z&x4M4CW9!V?eD0HT2RjXnQ4#qiuc?a7&_eF?u-+( z>WfKAx+qq73c<(6m-4M2x9ezdbaqw>2nsrWZ-K8>isHiS+l2^ZyLG|o=LdL3)&JZ) zTT@a}WPJ(9gx6=H?YvY}RJyyfal{`zN*ti$y>Q`Cv0Q4VsW7JR8Vk$#FR|m@&cm6i z0I0J%&=7f}_j!&^F((bzcsj*_CxLJMB_SbKJ!|X5KdJH&O8gOTD4R)0NZKl%=H}+^ zpSTqVp3FS}F82IlECjSPG?9y3Sa4_u9%_rvIXRmK)oz>nkc{YWJ1?HK1=EB0Ma>W} z!(vA+E_~i==Z}Y&m{_6cH7|%FcB+B>MHZ?ZPvvA_h3amvRBcG==?&k6v_!GUc}E*+ zbZt60ng)S1QkH8lMuL!?p{#84Jv?L>z}y{P__LV!{%!$UA}jk6ccYZdY9fAJ4Qsh~ z;lhO|1!{2}1=q@vMkw<`@sP;3!XhFfwts&nz7ajzncTj5^=d3J;=@v8H+CeDevFx$ z`#{uZIrqkxE5vw%mLeoYnk|I> z(@i@A+uR|SjTyy|+zB>hyrjFkJMi7RcS8}^bhq4$d8h;y_z}pvI%&8pik8KL*0qSh zS7k)q@mwkWDS{yNEDg`q#llW6r=`JSsY(~DHX+i1Al)V%E633{?QXy-bB6iNMvouw zELW~Pj`P}^`vrfIjb{yW`=eKs7iZSf%G@?HHQn6Ye!U{4)3GYnDb~nx>ai?d22P`% z<`t`IhFY&>afL#TMnq<>rH#0FUB=tDZ|^B7DTP%XA8YCB#}0>1e(59jPJw{zy*|}! z_1M^0ELy;#`#qcDr(cm=$b-=_O#_4FPobeS?&EbY{z6nZyhr&`JQK%CRbT%aV1a{m zbk?|j4-T3_!8h%=GI|(&bhy7VKK{>}K0u0Iz0Na5NlxyQBMi@7Xxh#&1kr^*?QE#* z0V4o^i13<$OxKO-G+V>3>AEftm;X6;aDf$&LLvm6cW9Ume}PMAJ67&sc1-Bm#E1Am zeb0QFnYp%KO^kRo?I_HyW;d+~i@`17F|6?@S4#I!xENgV@#9BPyV}Do&2Mig#)2av z`d|AY6yXMWc0x|`zs`(#Y$$r;V2L5}4M5S}RDHC!zJmJw#2s~d6y$?4jG;?$W zUt1#K%s7{skoQu_){XD!SJF~b6`u%WT>ixo8vlJ0Yd?PY&=sbFgfrq?W<+XsXQIz%Y33c#^$?c16Zl?uKL0D@n46PxJ&gft@*0sP zzyem7h7!||dZ(RvX9$R!??RBdlc=z}FR=iJhu2trKAu7VnY*6LI(*^o0%gNn$O8{J zF_F?lk#KAhpqX82#7o-MwR{1VChk!t!gl%=bklM;>b<_ zL>w)sTp~Ll?!GoNF~L_QuDhdG_Vj{fM~u)43^ZBy0=G+nqOJ(s;eI9(8MHK1+O#xK zXhw+{H-n74xwl&{iYTy)i0I!tgA^vkLET)buCCsJhduU^ktEJOAXHd}*h~>C<{f8- zkC;vY%30FL)f0M$)?cWl^Rr^5PCs9pkQ8e{A|n9E9WFF6ds|=KMG|@~dld*1x<(C` z)iBq2z>MOUy${wZ@sOOpfH`FK2q)$8rAznPT3Y-*x*_9?BtKBZ$1R2{qAL zObRX**o^BG*v5ytx~==9*H73WGYF~iPjG?mRCyx6AacX{cd!h65PytvM`|V}sr(rD zNL=o;5WbxkPkZv)MHH3B;lcNpXMj9<=vG}rd~#GqM#fruM@JwF{KUfhhMZ|$7T$?J z4rCTP4=gFXgRpi8Hn#{ZRYXPxsHs+1q&Z^rlY*C*s2B{xB1p$$a2dW~5rn$^5;|~3 zMt1gpzUl4lMX#G8mELn2{s(`8ctV993oj%~Q&sgI{1>-;FLiPr$3^rLyb$!H|HC&d z#fXueowt8DZdENJ!-YV7tD-|LFt{%-e+I$9mV1eZb=hOL>5zB$$jzHKYZ8$FIt1pQ z5@}P7zG1U&F7%V#UZ>R7^93K=PGL%ydAAKPRu;F7bgt=^R4vZVMkuqwK-wxdo?sisg8SmrZIoEQnU<>gwtxp6Y+yICm*`mZ-}1DPwto6p{r(tp78C zIFf%007(2cAUL`nr0l9tPnx28yy`L5Bt*U%L5J<{=*Ydn!C?{1Li9p`cwAZZ`qX+` zKLnO1)q-Br9dEOn{yPN{%}e9E012;Po1pZ3dmYc+S*aNHa0mv za`hiG)HtC$)hX7|rv>VOlbxMi7f4%GCM?3@3e0>zfZjt9w|~Et1rekVD~UxA zN-$gm^@0C}H^FQ|tY!S0o15#9L*5kWM-z1m}*Y12f;#E4Od3`t|vt6&Ogt z9;`MbEH7tBU6D5-4KAEm7jzj0R8M0OBSCw6dz{J1$$kjFUT1s3v@9*>v!JlDl9!V^ zpTqzIPQXpR17<{5=i$Sy*g52&9C-Feop(0cDkdf-!cS~v{f%}sl(JR2hK9^7YRIwz zpyeP<16PyL_UN0@Dr9h_cg&A-si8Xo(TKWU09jV@@;Vv^s9$S${p=3?X)w6((lIah z87M~guH$2CXMZN%P>`Dpj|iEu>5LPpHot8o3~QeV zL0V6W6rxfDqyu0RFUOSNriI1DHGiu$b*D-|5r8u>ME<~ocTGF%KvuLdl7 zZthoxD)-6q0%xssMPE;EtH-&nsKRmX<3NgRh%Rark+U5wPhS7{@xu;H7Y`pkBs{sE z6;unAASX)P#9FXJjR5?z#mV8tb#-+yXnZR=e?8z~vQ&-@Fr4@&7qL6oS@VCwr+s6I za5Np|r~zHv+25btgb;oOev<9*=cy?J0yD0`8-BA_h`ZzJ3~e+~GZMtR zbG+WS6u8tYQ75UR8@){wj9f;0RtmV|%P(KPq-6yGR9XmWy^@Z1oT|p@gqHcNf`Y~SKm#_>(bAG9 zaAJe0fzw4B3iv2(DJcXwv3DLgicG0wS*UjRv1k@ig?dc|Jd6`JgK6isHt^i+4U&_Wk52#_8mGtsw(Yy$nX8Qq z0a6`!2(40j562bdxPz|kF>f(HO9UFcRArAF{HD?CY(w?4XmP0ACH8tf`0)T&ziMeyuUVd~3xNve{-ejV$#Cxn~ zeKBszeE|5bi01mj_M#XX%r8K5Ty5L{y?KMPr(TbPBM@G>a%DR(AYcSIz0PV329u5= zjx8Jtv>yq)ceWMy#0u~$+t-0dSHlOpPykQbfws_BsP0!kWMwUQ1xPuperY;?J3}K& zzSq(zs^!LJh-_y3Wp{8`fRu2T;}Lpm(0cb*DjDHQ-kV2HJz9qu{xqa++GSZc4Oh%K_k4F>@hGV?T`BUL>4YCF2&@oMPL~=9-?Qyl6bhU>7578s;;6k;RG-rjZoESB{ur= z=eVpS24;r87syjpv?B@aA8P1Fd0inq7$YXX3COw=IPy5}`HXZ84Rv)PW?{$Avk>px znS|`8;-PYmki&&*o7N2s><&ZcQxuwetKL)guCW|V&W?`Re@7~}!y&NRLFMLX0D0po zlt6Mn7dEeD+(8a_X)#G%zlVnC*e+jIIG)eSlXyeMSknEA@OTUj_K~3KXoG4zA0je$ zc=HohM+~fGnRgLbykVK={#Gu4wCGfo49=BVf3bf*??phTV`&YFT*)AA{R-1@~A6$|ioX zH>>}K!vGs}i@!N^ifsRZHUkw9M=CNAs4-EK5E1>}K=afn++D~_nWu>R)`5L*rn+)P zW#w%5HE@YKyb70rt%L9`j4UuMut0H&^H(tUEYTz#%(~!^6W$?Lg3{q@Fvl1ICy$2CimauIClT4e=0h zxtsVv4`mtHU0huJ@4O{|4oxhy5^3&I7CBO*7vUegIr`lAG4Ny0&{mrm#^YtaModYdey6i9kVeAjE zCVQQQ{_NT30v9hnX4WTw(Y!X6yg@3_n(fNm^q!tSq7Zf2x;zxOw%6DHNfTT#KDqJg zJPZKDpX|^r4*%+9Dey_ekr4)_#H;V?+sah)VvdmeiGf8tQUQ<=gciRtj|@S5M1Ip| zP#``Rmjw}DhYq1_#$p!KD5Mk=$FKkMrLfbyqr&6;XvuzfW)@dqG+9*!4U2W!!_Yek z-og9OEQgYzQse0Gm%k4Tln?jyl>{Pappkj2lT&lC*z-sTc`7ZAej$v=EDz;NBz{KG zme2^HID&n`5!Mo|GHeI=TX7q`i1zgKv?a&#wzAk^O4>ep6)te<3&ozfnVI&`#dAtH z`O+R)4K@G!2lVzhNQ!)VPX-iWa&r565UuadqT@JOW-w8vKJP=la7PSHPwhuI@Se(H z>clJ^vC*vn41ZQXSD{ z{sd|h9LU^0dk`v=WgbbVI+mP_FAt?(b&e-9w4c?Q0-31iZoqM?g`MTEZ}CwZ+7?exX0dlcCihN1l+h2 z4Gz2&r_i$u=b^jYR#Xz3`F{ru`68(EkR4nQDUcjMA7D?nM>I#fa3&0TaNZT9=sC^W zSV@1{>POcoh@hNa9jkJ6z_Gy>2UGnDT7!G0ZINHTn+xdtJIH|fjl1=1LRjMn3<7ca z3(vR)P%ozdQye-Jo%n3DrIl4RDnZ%=R8jO+bLVl<12@U`KvT1SJ=SG3O3Y<> z*oBP1SGzq6)B)+xGszyyfAmeDW*1$cv~&Zw0Y;wMgY`You9-RfPC&WOAgJ!P0UpOE ziJSyPVf(2cs<;HFejH5r^E9IUCW^<5P^|0Cwnc3m!Eh=(`V}-%nh@u(`w0aF-QJ^B zuJPX+8%;e9H~W=G^5XF=!2&>o_32lw_wgj-P1_g^0A7k-CuabPunKC2X_*AJfMRj1 zw)Pm{(>aC(#$(`I;(!VlZ-k!Y%wI=g!%PaqTS1BVsn`j>+7im~Q1O!h$0<@$d5{JQ z@$uQC#81odawLeA)|BMs7h=Q1`(~$_L-bD(_!5Q@fc>>S0Aj@jP^kyJszA&%2f42c z)r6pa43*e@i1@&^u!5*Y2N<5uSy@)=J<4JkfUwgwvNqYTUfn2jUefV@|Ni}7DD=s3 zvi8uV*!uYT**lOYMaMyTgX^_F2E~#r@L5;0pb`e|VQdjSD&wUu%ryA{@>50&N^Dq! z{~n6w4&)si7)vEtjguJu%P7L7(Kr7u{s();yf2#`y=I2%)CXx4=*R@r)}r(&@~*4I zc4W{W-eF(ff>>BqS!u`$pI9!yYKUGUxhk-Uw9^C=CDeyPe&N@rxHP{&P7QsFJAQW^qrh`4p7|q22QSV>CKq!x)7f z|LOn;k%v#>7enPt>Vq%b(>UH51L%n4KZe9QEDbc!^vSi7pzN9hnTqbN`*8qz`k8_+ zUpS)pOj@3R8dCV=HcrFn(s__u!j4zgxF%(Rlppl1^6V zRA)u+%i?FvS|ekgC}dr;qj?IHDbA;Y(EG0idU`gMA!6w5)sdi`=QR*Y@J%WmSH*n9 zAVysvGW`;-7%S|wp2xiPpV29fPR^8tHg4@utqgjm1jP|Z;dFMupK7*Uj`+}PlHS<~ zV!FMR3{c)id}Z{A@HoQ2Z7vohw+-8TL??#{@6_(iXZ0Na#fYJkko`U+q-Xae zTZ3-SCF=1V^s!C31q2+2P(|YC$jD)4M&o6;s(wYZRn80dN1%A!eMM)mv;Fq;rSK@X z(dIKGuRyYq!G{d*zOk?7XzE$mB+2v}Ti@8Y{SSbK$QbycY5;GIUWOV>#W?q8wMUu3B$CF)c(BqSnsxnC32x>(@ymf}t89aX! z&SCd=qZAjLm&c=z!QPITTv*UG%B=tAR_(KoXo=XMN;n8Y7E-8|$hq{rlmYP;$Ns65TToFSpCnqs03ILf8>)H8p|QElgef0!&;kM^kHOr}xWD zog1ji5V#N~lv(`?FtI0@$-v;oDI^rdjZ+uj3isT6V;T!h_VOwF-ClsOw)BAL zalo}bb342Iop%aE%_1Q1E2VY;+S5Tb=MJvDkxOlX zTH^0udc2ogIf#P$y0>Q|5Xy7ssxsgVC)hAaC?O%ir+6}V+K4#@G$5U1%%UE<5I_2a zg@rY=TD=abkP7FePZ6P^_tP=sEJ4q4q`(q^E4uM^PpB6EibStDJp~ zJPoR=UO$l|C)S}~KY6Rp* z=H|Vby@4Q}0LM5`0LcI$Az|!0TqOON8G(+(#_7|i_mh&7RbeXJ#52@JLoKgO)gID$ z?)}?E0hb;WHew4yr7QhlSE!;3DCzN`W6udtb6o|!FS}ne8qBBdU76H(V-d7rZ*bV@ zeN4KH!BW{IvR?t=3DClVkY0(IriiX!yDaqC#D~(Y3F;tc!QeAMk1C*Fbw%sD3o|Yj zn!EsEIsqCT7lLB+xg5SYrw{Cs0PVcZy4^8Y*cYkf59!B;t9Qr{S6?e8~?&6(W#Z^MYo2OTXYrv*3SeZ(T-R z&7_Ra9iYNn2M34Sa-aVv(XAeda(`h9vg+V=4LU;f!5==Xv6|o-*-%kaM?eug6X~W0 zkxaM9yz6=WUi?A2%~;K0^N`EL24upfY(6`ef7Eq(o695n)Hxcr1G_Q#w7|&w(*YZo z$jdD_ROzxZ39xI(IKZi}xVV~uhQ@Jf>+aadNUWqs-#G+03Tps6L0`@zSV3U(D*N*c z#lAK)qz?Zw?(gq!MI}W`AgnyhNi`rRC&!1eEt1&Tq+#O=NNzHXXtmjPM~+?rNB??l zvPtZVQN54aUCQ&RFA=UViNqf}M2@7?D!QD!aBuY7GiT(-u=if8l={A>#?A*#_%0;91i-}@3H-VMBhQks=p>gc0FieO+j?5O?{7WDRfxnRc}262%^fkfG>J{uu%qsc5#~BR)c-*J){#RQi ze%&1#8#^X^NaKQT0D>JvdKE$YC&NH=o-Hx&N*WpFBC7M9f~_@MNBb+v6sYL(cV4l_ z?)rCV^NscwKR`Fbpdgs-KZy7=z#b9L3#DWPt1Ni`8@os1>DE$F zt8#eutgG85QXMHnZ4ko@E5@Gh*b1YQ9B?|ILEUD-q1!*)RJi88(F zCBP1WesaVXyub<+EEU}Zh)Zi%7w>To`GtV>^G>5uE4f{4@J0jhR;A4$t3ErL#HgV z`O6eYBhOmHW9ScJV0)Rq>&=_{7T_C4o&Gx?zkT~w`;aq?Yr+@K%Y%EBUaC1*Z{3A$ zNkKidNbU5@Ovz2yhB5+#-ABO6j!^1D9dL+7$gyVCqhFRz%S)0TXl|Ic7xLeM-U~l0 z?LP%2C9gyP{k3%?c$kdVIe?h9z%9Uz%^{Zv&_s%TCi`FRYYW(I!_>{=)Y-ri7l1t2 z={IbOdw+tvNP@{xAwQ&^!wL}PHiJ&nZQP}F9|X%djX}({pFxIu5Kr*{(jOL!oh)4` zUzwbAh+BSv7)e0mS`pO1g83Q!P`jf(Qpo z4{f&Vw6wG&Aa#`hVHNBd-~_hgZh8+fv;}Jq3JvnoC&e!nl$O$g)*?YA120vDgFQ?x z5nz)~dU`t4Etdd(5{-_I`n-AbCZ}914z%-y$G?lMG!KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0%S=R#6ndfA8xfGAt+v92%s|(gq0?hlW6cK6Hp&TWrWBqB&b~3#VNA zH)aI;|lDA<>Pd7(vUwghev><10{mcy37KLq<_!QKV52|hn9 zftLmQMPM+-J|e{L04tW$T9*n@j*kz;^`LE#HUK4RE7y z(DKM^iZuep7u5fN&($OFabTkc>~qUStbmZvbSr+-;M+y)Xa( N002ovPDHLkV1k#tX$$}W