From 83d3aa519ff7673151d2b744b27950a8c182194d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Van=CC=8Co?= Date: Fri, 28 Oct 2016 17:41:29 +0200 Subject: [PATCH 1/2] Add failing test --- SwinjectStoryboard.xcodeproj/project.pbxproj | 20 +++++++++++ Tests/OSX/AnimalPagesViewController.swift | 23 ++++++++++++ Tests/OSX/Pages.storyboard | 35 +++++++++++++++++++ Tests/OSX/SwinjectStoryboardSpec.swift | 12 +++++++ .../iOS-tvOS/AnimalPagesViewController.swift | 23 ++++++++++++ Tests/iOS-tvOS/Pages.storyboard | 35 +++++++++++++++++++ Tests/iOS-tvOS/SwinjectStoryboardSpec.swift | 12 +++++++ 7 files changed, 160 insertions(+) create mode 100644 Tests/OSX/AnimalPagesViewController.swift create mode 100644 Tests/OSX/Pages.storyboard create mode 100644 Tests/iOS-tvOS/AnimalPagesViewController.swift create mode 100644 Tests/iOS-tvOS/Pages.storyboard diff --git a/SwinjectStoryboard.xcodeproj/project.pbxproj b/SwinjectStoryboard.xcodeproj/project.pbxproj index 92adfb8..4772f8b 100644 --- a/SwinjectStoryboard.xcodeproj/project.pbxproj +++ b/SwinjectStoryboard.xcodeproj/project.pbxproj @@ -106,6 +106,12 @@ CD2C63AD1D786C1F0075BC14 /* RelationshipReference1.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD2C63AC1D786C1F0075BC14 /* RelationshipReference1.storyboard */; }; CD2C63AF1D786CD70075BC14 /* RelationshipReference2.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD2C63AE1D786CD70075BC14 /* RelationshipReference2.storyboard */; }; CD2C63B01D786D6B0075BC14 /* SwinjectStoryboard+StoryboardReference.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C63A91D7864840075BC14 /* SwinjectStoryboard+StoryboardReference.swift */; }; + CD3AB1991DC3A851001A45FA /* AnimalPagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1981DC3A851001A45FA /* AnimalPagesViewController.swift */; }; + CD3AB19A1DC3A851001A45FA /* AnimalPagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1981DC3A851001A45FA /* AnimalPagesViewController.swift */; }; + CD3AB1A91DC3A858001A45FA /* Pages.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD3AB1A81DC3A858001A45FA /* Pages.storyboard */; }; + CD3AB1AA1DC3A858001A45FA /* Pages.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD3AB1A81DC3A858001A45FA /* Pages.storyboard */; }; + CD3AB1AE1DC3A8CD001A45FA /* AnimalPagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1AD1DC3A8CD001A45FA /* AnimalPagesViewController.swift */; }; + CD3AB1B01DC3A8D6001A45FA /* Pages.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD3AB1AF1DC3A8D6001A45FA /* Pages.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -423,6 +429,10 @@ CD2C63A91D7864840075BC14 /* SwinjectStoryboard+StoryboardReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwinjectStoryboard+StoryboardReference.swift"; sourceTree = ""; }; CD2C63AC1D786C1F0075BC14 /* RelationshipReference1.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RelationshipReference1.storyboard; sourceTree = ""; }; CD2C63AE1D786CD70075BC14 /* RelationshipReference2.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RelationshipReference2.storyboard; sourceTree = ""; }; + CD3AB1981DC3A851001A45FA /* AnimalPagesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimalPagesViewController.swift; sourceTree = ""; }; + CD3AB1A81DC3A858001A45FA /* Pages.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Pages.storyboard; sourceTree = ""; }; + CD3AB1AD1DC3A8CD001A45FA /* AnimalPagesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimalPagesViewController.swift; sourceTree = ""; }; + CD3AB1AF1DC3A8D6001A45FA /* Pages.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Pages.storyboard; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -537,8 +547,10 @@ isa = PBXGroup; children = ( 983DFEF01CDB426100D39731 /* AnimalViewController.swift */, + CD3AB1AD1DC3A8CD001A45FA /* AnimalPagesViewController.swift */, 983DFEF11CDB426100D39731 /* AnimalWindowController.swift */, 983DFEEF1CDB426100D39731 /* Animals.storyboard */, + CD3AB1AF1DC3A8D6001A45FA /* Pages.storyboard */, 983DFEF51CDB426100D39731 /* Tabs.storyboard */, 983DFEF61CDB426100D39731 /* ViewController1.swift */, CD2C63AC1D786C1F0075BC14 /* RelationshipReference1.storyboard */, @@ -553,8 +565,10 @@ isa = PBXGroup; children = ( 983DFED91CDB425600D39731 /* AnimalViewController.swift */, + CD3AB1981DC3A851001A45FA /* AnimalPagesViewController.swift */, 983DFED81CDB425600D39731 /* Animals.storyboard */, 983DFEDD1CDB425600D39731 /* Tabs.storyboard */, + CD3AB1A81DC3A858001A45FA /* Pages.storyboard */, 983DFEDA1CDB425600D39731 /* Storyboard1.storyboard */, 983DFEDB1CDB425600D39731 /* Storyboard2.storyboard */, 983DFED71CDB425600D39731 /* AnimalPlayerViewController.swift */, @@ -1138,6 +1152,7 @@ 983DFEEC1CDB425600D39731 /* Tabs.storyboard in Resources */, 983DFEDE1CDB425600D39731 /* AnimalPlayerViewController.storyboard in Resources */, 983DFEE61CDB425600D39731 /* Storyboard1.storyboard in Resources */, + CD3AB1A91DC3A858001A45FA /* Pages.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1158,6 +1173,7 @@ 983DFEFA1CDB426100D39731 /* Storyboard1.storyboard in Resources */, CD2C63AD1D786C1F0075BC14 /* RelationshipReference1.storyboard in Resources */, CD2C63AF1D786CD70075BC14 /* RelationshipReference2.storyboard in Resources */, + CD3AB1B01DC3A8D6001A45FA /* Pages.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1179,6 +1195,7 @@ 983DFEED1CDB425600D39731 /* Tabs.storyboard in Resources */, 983DFEDF1CDB425600D39731 /* AnimalPlayerViewController.storyboard in Resources */, 983DFEE71CDB425600D39731 /* Storyboard1.storyboard in Resources */, + CD3AB1AA1DC3A858001A45FA /* Pages.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1207,6 +1224,7 @@ buildActionMask = 2147483647; files = ( 983DFED21CDB423800D39731 /* ViewController+SwinjectSpec.swift in Sources */, + CD3AB1991DC3A851001A45FA /* AnimalPagesViewController.swift in Sources */, 983DFEE41CDB425600D39731 /* AnimalViewController.swift in Sources */, 983DFEEA1CDB425600D39731 /* SwinjectStoryboardSpec.swift in Sources */, 983DFEC91CDB423800D39731 /* Container+SwinjectStoryboardSpec.swift in Sources */, @@ -1247,6 +1265,7 @@ 983DFF081CDB433A00D39731 /* FoodType.swift in Sources */, 983DFEFC1CDB426100D39731 /* SwinjectStoryboardSpec.swift in Sources */, 983DFED01CDB423800D39731 /* Storyboard+SwizzlingSpec.swift in Sources */, + CD3AB1AE1DC3A8CD001A45FA /* AnimalPagesViewController.swift in Sources */, 983DFECD1CDB423800D39731 /* NSWindowController+SwinjectSpec.swift in Sources */, 983DFEF81CDB426100D39731 /* AnimalViewController.swift in Sources */, 983DFEF91CDB426100D39731 /* AnimalWindowController.swift in Sources */, @@ -1276,6 +1295,7 @@ buildActionMask = 2147483647; files = ( 983DFED41CDB423800D39731 /* ViewController+SwinjectSpec.swift in Sources */, + CD3AB19A1DC3A851001A45FA /* AnimalPagesViewController.swift in Sources */, 983DFEE51CDB425600D39731 /* AnimalViewController.swift in Sources */, 983DFEEB1CDB425600D39731 /* SwinjectStoryboardSpec.swift in Sources */, 983DFECB1CDB423800D39731 /* Container+SwinjectStoryboardSpec.swift in Sources */, diff --git a/Tests/OSX/AnimalPagesViewController.swift b/Tests/OSX/AnimalPagesViewController.swift new file mode 100644 index 0000000..4dbd09d --- /dev/null +++ b/Tests/OSX/AnimalPagesViewController.swift @@ -0,0 +1,23 @@ +// +// AnimalPagesViewController.swift +// Swinject +// +// Created by Jakub Vaňo on 27/10/16. +// Copyright © 2016 Swinject Contributors. All rights reserved. +// + +import AppKit +import Swinject + +internal class AnimalPagesViewController: NSPageController { + let animalPage: AnimalViewController + + required init?(coder aDecoder: NSCoder) { + animalPage = NSStoryboard( + name: "Pages", + bundle: Bundle(for: AnimalPagesViewController.self) + ).instantiateController(withIdentifier: "AnimalPage") as! AnimalViewController + + super.init(coder: aDecoder) + } +} diff --git a/Tests/OSX/Pages.storyboard b/Tests/OSX/Pages.storyboard new file mode 100644 index 0000000..df6ee0d --- /dev/null +++ b/Tests/OSX/Pages.storyboard @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/OSX/SwinjectStoryboardSpec.swift b/Tests/OSX/SwinjectStoryboardSpec.swift index 738e51d..afb10eb 100644 --- a/Tests/OSX/SwinjectStoryboardSpec.swift +++ b/Tests/OSX/SwinjectStoryboardSpec.swift @@ -109,6 +109,18 @@ class SwinjectStoryboardSpec: QuickSpec { expect(animalViewController.hasAnimal(named: "Mimi")) == true } } + context("with second controller instantiation during instantiation of initial one") { + it("injects second controller.") { + container.storyboardInitCompleted(AnimalViewController.self) { r, c in + c.animal = r.resolve(AnimalType.self) + } + container.register(AnimalType.self) { _ in Cat(name: "Mimi") } + + let storyboard = SwinjectStoryboard.create(name: "Pages", bundle: bundle, container: container) + let pagesController = storyboard.instantiateInitialController() as! AnimalPagesViewController + expect(pagesController.animalPage.hasAnimal(named: "Mimi")) == true + } + } } describe("Initial controller") { it("injects dependency definded by initCompleted handler.") { diff --git a/Tests/iOS-tvOS/AnimalPagesViewController.swift b/Tests/iOS-tvOS/AnimalPagesViewController.swift new file mode 100644 index 0000000..c85f8ab --- /dev/null +++ b/Tests/iOS-tvOS/AnimalPagesViewController.swift @@ -0,0 +1,23 @@ +// +// AnimalPagesViewController.swift +// Swinject +// +// Created by Jakub Vaňo on 27/10/16. +// Copyright © 2016 Swinject Contributors. All rights reserved. +// + +import UIKit +import Swinject + +internal class AnimalPagesViewController: UIPageViewController { + let animalPage: AnimalViewController + + required init?(coder aDecoder: NSCoder) { + animalPage = UIStoryboard( + name: "Pages", + bundle: Bundle(for: AnimalPagesViewController.self) + ).instantiateViewController(withIdentifier: "AnimalPage") as! AnimalViewController + + super.init(coder: aDecoder) + } +} diff --git a/Tests/iOS-tvOS/Pages.storyboard b/Tests/iOS-tvOS/Pages.storyboard new file mode 100644 index 0000000..d3ae888 --- /dev/null +++ b/Tests/iOS-tvOS/Pages.storyboard @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/iOS-tvOS/SwinjectStoryboardSpec.swift b/Tests/iOS-tvOS/SwinjectStoryboardSpec.swift index ca30209..2e89ce5 100644 --- a/Tests/iOS-tvOS/SwinjectStoryboardSpec.swift +++ b/Tests/iOS-tvOS/SwinjectStoryboardSpec.swift @@ -83,6 +83,18 @@ class SwinjectStoryboardSpec: QuickSpec { expect(animalViewController.hasAnimal(named: "Mimi")) == true } } + context("with second controller instantiation during instantiation of initial one") { + it("injects second controller.") { + container.storyboardInitCompleted(AnimalViewController.self) { r, c in + c.animal = r.resolve(AnimalType.self) + } + container.register(AnimalType.self) { _ in Cat(name: "Mimi") } + + let storyboard = SwinjectStoryboard.create(name: "Pages", bundle: bundle, container: container) + let pagesController = storyboard.instantiateInitialViewController() as! AnimalPagesViewController + expect(pagesController.animalPage.hasAnimal(named: "Mimi")) == true + } + } } describe("Initial view controller") { it("injects dependency definded by initCompleted handler.") { From 215960439ad17f03a0c9af2bb474b6ffb277cc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Van=CC=8Co?= Date: Fri, 28 Oct 2016 17:47:57 +0200 Subject: [PATCH 2/2] Properly prevent duplicit view controller injection --- Sources/InjectionVerifiable.swift | 11 +++ Sources/RegistrationNameAssociatable.swift | 13 ---- Sources/SwinjectStoryboard.swift | 18 +++-- Sources/ViewController+Swinject.swift | 74 +++++++++++++------- SwinjectStoryboard.xcodeproj/project.pbxproj | 8 +++ 5 files changed, 80 insertions(+), 44 deletions(-) create mode 100644 Sources/InjectionVerifiable.swift diff --git a/Sources/InjectionVerifiable.swift b/Sources/InjectionVerifiable.swift new file mode 100644 index 0000000..9eb2a47 --- /dev/null +++ b/Sources/InjectionVerifiable.swift @@ -0,0 +1,11 @@ +// +// InjectionVerifiable.swift +// Swinject +// +// Created by Jakub Vaňo on 28/10/16. +// Copyright © 2016 Swinject Contributors. All rights reserved. +// + +internal protocol InjectionVerifiable: AnyObject { + var wasInjected: Bool { get set } +} diff --git a/Sources/RegistrationNameAssociatable.swift b/Sources/RegistrationNameAssociatable.swift index 9efb63d..f45dbd6 100644 --- a/Sources/RegistrationNameAssociatable.swift +++ b/Sources/RegistrationNameAssociatable.swift @@ -6,19 +6,6 @@ // Copyright © 2015 Swinject Contributors. All rights reserved. // -import Foundation -import ObjectiveC - internal protocol RegistrationNameAssociatable: AnyObject { var swinjectRegistrationName: String? { get set } } - -extension RegistrationNameAssociatable { - internal func getAssociatedString(key: UnsafeRawPointer) -> String? { - return objc_getAssociatedObject(self, key) as? String - } - - internal func setAssociatedString(_ string: String?, key: UnsafeRawPointer) { - objc_setAssociatedObject(self, key, string, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY) - } -} diff --git a/Sources/SwinjectStoryboard.swift b/Sources/SwinjectStoryboard.swift index 6165b6c..3659602 100644 --- a/Sources/SwinjectStoryboard.swift +++ b/Sources/SwinjectStoryboard.swift @@ -82,13 +82,15 @@ public class SwinjectStoryboard: _SwinjectStoryboardBase, SwinjectStoryboardType let viewController = super.instantiateViewController(withIdentifier: identifier) SwinjectStoryboard.popInstantiatingStoryboard() - if !SwinjectStoryboard.isCreatingStoryboardReference { - injectDependency(to: viewController) - } + injectDependency(to: viewController) + return viewController } private func injectDependency(to viewController: UIViewController) { + guard !viewController.wasInjected else { return } + defer { viewController.wasInjected = true } + let registrationName = viewController.swinjectRegistrationName // Xcode 7.1 workaround for Issue #10. This workaround is not necessary with Xcode 7. @@ -120,13 +122,17 @@ public class SwinjectStoryboard: _SwinjectStoryboardBase, SwinjectStoryboardType let controller = super.instantiateController(withIdentifier: identifier) SwinjectStoryboard.popInstantiatingStoryboard() - if !SwinjectStoryboard.isCreatingStoryboardReference { - injectDependency(to: controller) - } + injectDependency(to: controller) + return controller } private func injectDependency(to controller: Container.Controller) { + if let controller = controller as? InjectionVerifiable { + guard !controller.wasInjected else { return } + defer { controller.wasInjected = true } + } + let registrationName = (controller as? RegistrationNameAssociatable)?.swinjectRegistrationName // Xcode 7.1 workaround for Issue #10. This workaround is not necessary with Xcode 7. diff --git a/Sources/ViewController+Swinject.swift b/Sources/ViewController+Swinject.swift index da63712..36cb600 100644 --- a/Sources/ViewController+Swinject.swift +++ b/Sources/ViewController+Swinject.swift @@ -6,48 +6,72 @@ // Copyright © 2015 Swinject Contributors. All rights reserved. // -import Swinject +import ObjectiveC #if os(iOS) || os(tvOS) -private var uivcAssociationKey: String = "UIViewController.swinjectRegistrationName" +private var uivcRegistrationNameKey: String = "UIViewController.swinjectRegistrationName" +private var uivcWasInjectedKey: String = "UIViewController.wasInjected" -extension UIViewController: RegistrationNameAssociatable { +extension UIViewController: RegistrationNameAssociatable, InjectionVerifiable { internal var swinjectRegistrationName: String? { - get { - return getAssociatedString(key: &uivcAssociationKey) - } - set { - setAssociatedString(newValue, key: &uivcAssociationKey) - } + get { return getAssociatedString(key: &uivcRegistrationNameKey) } + set { setAssociatedString(newValue, key: &uivcRegistrationNameKey) } + } + + internal var wasInjected: Bool { + get { return getAssociatedBool(key: &uivcWasInjectedKey) ?? false } + set { setAssociatedBool(newValue, key: &uivcWasInjectedKey) } } } #elseif os(OSX) -private var nsvcAssociationKey: String = "NSViewController.swinjectRegistrationName" -private var nswcAssociationKey: String = "NSWindowController.swinjectRegistrationName" +private var nsvcRegistrationNameKey: String = "NSViewController.swinjectRegistrationName" +private var nswcRegistrationNameKey: String = "NSWindowController.swinjectRegistrationName" +private var nsvcWasInjectedKey: String = "NSViewController.wasInjected" +private var nswcWasInjectedKey: String = "NSWindowController.wasInjected" -extension NSViewController: RegistrationNameAssociatable { +extension NSViewController: RegistrationNameAssociatable, InjectionVerifiable { internal var swinjectRegistrationName: String? { - get { - return getAssociatedString(key: &nsvcAssociationKey) - } - set { - setAssociatedString(newValue, key: &nsvcAssociationKey) - } + get { return getAssociatedString(key: &nsvcRegistrationNameKey) } + set { setAssociatedString(newValue, key: &nsvcRegistrationNameKey) } + } + + internal var wasInjected: Bool { + get { return getAssociatedBool(key: &nsvcWasInjectedKey) ?? false } + set { setAssociatedBool(newValue, key: &nsvcWasInjectedKey) } } } -extension NSWindowController: RegistrationNameAssociatable { +extension NSWindowController: RegistrationNameAssociatable, InjectionVerifiable { internal var swinjectRegistrationName: String? { - get { - return getAssociatedString(key: &nswcAssociationKey) - } - set { - setAssociatedString(newValue, key: &nswcAssociationKey) - } + get { return getAssociatedString(key: &nsvcRegistrationNameKey) } + set { setAssociatedString(newValue, key: &nsvcRegistrationNameKey) } + } + + internal var wasInjected: Bool { + get { return getAssociatedBool(key: &nswcWasInjectedKey) ?? false } + set { setAssociatedBool(newValue, key: &nswcWasInjectedKey) } } } #endif + +extension NSObject { + fileprivate func getAssociatedString(key: UnsafeRawPointer) -> String? { + return objc_getAssociatedObject(self, key) as? String + } + + fileprivate func setAssociatedString(_ string: String?, key: UnsafeRawPointer) { + objc_setAssociatedObject(self, key, string, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY) + } + + fileprivate func getAssociatedBool(key: UnsafeRawPointer) -> Bool? { + return (objc_getAssociatedObject(self, key) as? NSNumber)?.boolValue + } + + fileprivate func setAssociatedBool(_ bool: Bool, key: UnsafeRawPointer) { + objc_setAssociatedObject(self, key, NSNumber(value: bool), objc_AssociationPolicy.OBJC_ASSOCIATION_COPY) + } +} diff --git a/SwinjectStoryboard.xcodeproj/project.pbxproj b/SwinjectStoryboard.xcodeproj/project.pbxproj index 4772f8b..f1cfe4c 100644 --- a/SwinjectStoryboard.xcodeproj/project.pbxproj +++ b/SwinjectStoryboard.xcodeproj/project.pbxproj @@ -112,6 +112,9 @@ CD3AB1AA1DC3A858001A45FA /* Pages.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD3AB1A81DC3A858001A45FA /* Pages.storyboard */; }; CD3AB1AE1DC3A8CD001A45FA /* AnimalPagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1AD1DC3A8CD001A45FA /* AnimalPagesViewController.swift */; }; CD3AB1B01DC3A8D6001A45FA /* Pages.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD3AB1AF1DC3A8D6001A45FA /* Pages.storyboard */; }; + CD3AB1B21DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1B11DC3A94A001A45FA /* InjectionVerifiable.swift */; }; + CD3AB1B31DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1B11DC3A94A001A45FA /* InjectionVerifiable.swift */; }; + CD3AB1B41DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3AB1B11DC3A94A001A45FA /* InjectionVerifiable.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -433,6 +436,7 @@ CD3AB1A81DC3A858001A45FA /* Pages.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Pages.storyboard; sourceTree = ""; }; CD3AB1AD1DC3A8CD001A45FA /* AnimalPagesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimalPagesViewController.swift; sourceTree = ""; }; CD3AB1AF1DC3A8D6001A45FA /* Pages.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Pages.storyboard; sourceTree = ""; }; + CD3AB1B11DC3A94A001A45FA /* InjectionVerifiable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InjectionVerifiable.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -626,6 +630,7 @@ 983DFEA01CDB410D00D39731 /* Storyboard+Swizzling.swift */, 983DFEA41CDB410D00D39731 /* ViewController+Swinject.swift */, 983DFF0A1CDB440800D39731 /* Box.swift */, + CD3AB1B11DC3A94A001A45FA /* InjectionVerifiable.swift */, 983DFF0E1CDB444E00D39731 /* RegistrationNameAssociatable.swift */, CD2C63A91D7864840075BC14 /* SwinjectStoryboard+StoryboardReference.swift */, 985904091CDB0AA700275E4A /* SwinjectStoryboard.h */, @@ -1208,6 +1213,7 @@ files = ( 983DFEA81CDB410D00D39731 /* Storyboard+Swizzling.swift in Sources */, 983DFEA51CDB410D00D39731 /* Container+SwinjectStoryboard.swift in Sources */, + CD3AB1B21DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */, 983DFEAE1CDB410D00D39731 /* SwinjectStoryboardOption.swift in Sources */, 983DFF0F1CDB444E00D39731 /* RegistrationNameAssociatable.swift in Sources */, 983DFEAB1CDB410D00D39731 /* SwinjectStoryboard.swift in Sources */, @@ -1243,6 +1249,7 @@ files = ( 983DFEA91CDB410D00D39731 /* Storyboard+Swizzling.swift in Sources */, 983DFEA61CDB410D00D39731 /* Container+SwinjectStoryboard.swift in Sources */, + CD3AB1B31DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */, 983DFEAF1CDB410D00D39731 /* SwinjectStoryboardOption.swift in Sources */, 983DFF101CDB444E00D39731 /* RegistrationNameAssociatable.swift in Sources */, CD2C63B01D786D6B0075BC14 /* SwinjectStoryboard+StoryboardReference.swift in Sources */, @@ -1279,6 +1286,7 @@ files = ( 983DFEAA1CDB410D00D39731 /* Storyboard+Swizzling.swift in Sources */, 983DFEA71CDB410D00D39731 /* Container+SwinjectStoryboard.swift in Sources */, + CD3AB1B41DC3A94A001A45FA /* InjectionVerifiable.swift in Sources */, 983DFEB01CDB410D00D39731 /* SwinjectStoryboardOption.swift in Sources */, 983DFF111CDB444E00D39731 /* RegistrationNameAssociatable.swift in Sources */, 983DFEAD1CDB410D00D39731 /* SwinjectStoryboard.swift in Sources */,