tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 1082HTML 1014Markdown 12TOML 83222 Definiciones

Basic working version of bindings

7764f7d92b43ed65d8c8667c20e2a047174b2375 · por Emil Sjölander · (hace 7 años) · padre 409cdc4cd · ver el árbol en este commit

Delta semántico · 23

bindings/swift/StretchCore/src/lib.rs

bindings/swift/StretchKit/Headers/libstretch.h

22 archivos · +1042 −179

diff --git a/.gitignore b/.gitignore
index 560bf9303..d0ecad27b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 /target
 /scripts/gentest/target
 /bindings/kotlin/stretch/src/main/rust/target
+/bindings/swift/StretchCore/target
 
 **/*.rs.bk
 Cargo.lock
diff --git a/StretchKit.podspec b/StretchKit.podspec
index 751e9191b..62d893a70 100644
--- a/StretchKit.podspec
+++ b/StretchKit.podspec
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
   s.social_media_url = 'https://twitter.com/vislyhq'
 
   s.swift_version = '4.2'
-  s.ios.deployment_target  = '10.0'
+  s.ios.deployment_target  = '9.3'
   s.source_files = 'bindings/swift/StretchKit/Classes/**/*'
   s.xcconfig = { "ENABLE_BITCODE" => "NO" }
 
diff --git a/bindings/swift/Example/Podfile.lock b/bindings/swift/Example/Podfile.lock
index 94c156585..888642e7b 100644
--- a/bindings/swift/Example/Podfile.lock
+++ b/bindings/swift/Example/Podfile.lock
@@ -22,7 +22,7 @@ EXTERNAL SOURCES:
 SPEC CHECKSUMS:
   Nimble: 45f786ae66faa9a709624227fae502db55a8bdd0
   Quick: 4be43f6634acfa727dd106bdf3929ce125ffa79d
-  StretchKit: 1583b151affb1d5f46f8a734e8cfe2254693d259
+  StretchKit: 9aea832d1c17ded921bf756907ad9e8be2a0a206
 
 PODFILE CHECKSUM: a2173ff6a63387c3ba08b3ae2b7d598a693b79b1
 
diff --git a/bindings/swift/Example/Pods/Local Podspecs/StretchKit.podspec.json b/bindings/swift/Example/Pods/Local Podspecs/StretchKit.podspec.json
index 604ff3e69..0822d8839 100644
--- a/bindings/swift/Example/Pods/Local Podspecs/StretchKit.podspec.json	
+++ b/bindings/swift/Example/Pods/Local Podspecs/StretchKit.podspec.json	
@@ -18,7 +18,7 @@
   "social_media_url": "https://twitter.com/vislyhq",
   "swift_versions": "4.2",
   "platforms": {
-    "ios": "10.0"
+    "ios": "9.3"
   },
   "source_files": "bindings/swift/StretchKit/Classes/**/*",
   "xcconfig": {
diff --git a/bindings/swift/Example/Pods/Manifest.lock b/bindings/swift/Example/Pods/Manifest.lock
index 94c156585..888642e7b 100644
--- a/bindings/swift/Example/Pods/Manifest.lock
+++ b/bindings/swift/Example/Pods/Manifest.lock
@@ -22,7 +22,7 @@ EXTERNAL SOURCES:
 SPEC CHECKSUMS:
   Nimble: 45f786ae66faa9a709624227fae502db55a8bdd0
   Quick: 4be43f6634acfa727dd106bdf3929ce125ffa79d
-  StretchKit: 1583b151affb1d5f46f8a734e8cfe2254693d259
+  StretchKit: 9aea832d1c17ded921bf756907ad9e8be2a0a206
 
 PODFILE CHECKSUM: a2173ff6a63387c3ba08b3ae2b7d598a693b79b1
 
diff --git a/bindings/swift/Example/Pods/Pods.xcodeproj/project.pbxproj b/bindings/swift/Example/Pods/Pods.xcodeproj/project.pbxproj
index d796b21da..0a60748d7 100644
--- a/bindings/swift/Example/Pods/Pods.xcodeproj/project.pbxproj
+++ b/bindings/swift/Example/Pods/Pods.xcodeproj/project.pbxproj
@@ -12,6 +12,7 @@
 		093B514AF1063F1DA238899699E270DC /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = A8313EAA34BE645217DF2852E1522C4B /* QuickSpec.m */; };
 		09B297BD6AFB877C72BAACA93DA5A883 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083FAD88BB13235D753745BB0BD020DC /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		0AECF1E83CBECC083136E419C6C632CA /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 97CC26A7C8608378C3FD9889E4AD23BF /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
+		0C26697ED9FBA7B5A8B80BF0E0861988 /* Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 697FAE697144A9C9E268F4E07CBAFD60 /* Layout.swift */; };
 		15A29851E570FF0D7FB6DE10D20AAB55 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA112225FF526E65896DDDF956F74AF1 /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		1635FE542AADC84063CC1653F53CF269 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7332A0B6ABF2ED2D514AA4D9D86E93 /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		1B84CD4780109223790812BD2C1D2811 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EA4ACEB8BB07BE97686541FE31664DC /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
@@ -37,17 +38,17 @@
 		4323D32B3358A3EC9A6115C532E80314 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 885169D56AF63F349D986F6FD6A19304 /* Quick-dummy.m */; };
 		45BC601FADAD02057F4B0E387E5F6F9A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD98DB8C1AA8E2390412D61DB64864D /* XCTest.framework */; };
 		47670595847368876E3EE8B7D433C506 /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84974814F581E3C4109C60E745BC7FA7 /* HooksPhase.swift */; };
+		4DBB99F8A44B24C0CEBB9221BA10647E /* StretchKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 47BA2A6FB0E07663CDC3EA6A18368537 /* StretchKit-dummy.m */; };
 		4EEC9C035622F4D4506DD25468515304 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A4BBF0EC502678F53DF8E608F8A6ACAD /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		50507B7B2A53B164B173A66463422828 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED6EF353CCE6BBF803A1F717FBEC8D1 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		550407BE017E8F9C887FB3C2E3AF5641 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F246159743DE22E6CD521024BC0F8B /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		552476489423BE8B6F3D12CC7097A3B4 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A0530A8F7FBFDC9F647711A1B1906204 /* Nimble-dummy.m */; };
 		57694C401F4C87A06394D9B589E412B9 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012EE64BD755D0863890CA9320E900A3 /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		58489F14E71BBAA7179632C277C4ABF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 02C2D11765F7EBF07D22F0B2B819E95E /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
-		5A3AC5C7475B822940B9EFEF9B045FD9 /* StretchKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AC245B889D6D310070EE5291DB4421A0 /* StretchKit-dummy.m */; };
 		5AD6E464DD1EE56955DE290C3C8B8FEC /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9194C82BBC06F2BF3019F69BBA2CFE6A /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		5ADD44A9A1DEE51ECC6712E2ECC9420E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE92ABC2F7B9A21F56722990F2D34E1 /* Foundation.framework */; };
 		5B007DA41E2B195E5FF32A567AFD41DB /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2934A3B4FE683A7B1077812515D6E5F0 /* XCTestSuite+QuickTestSuiteBuilder.m */; };
-		5C6BCBDCEF1EF1B8C19B75868A8C57F5 /* ReplaceMe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F6A794CA3727083DBDABBF55F3845C /* ReplaceMe.swift */; };
+		5D9F154AC1DC0CFC852E684D0EE47C26 /* libstretch.h in Headers */ = {isa = PBXBuildFile; fileRef = A3A57257CA5FF2FFBC4D546E1DFEA16F /* libstretch.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		5ED738281131106C6070594D132C5533 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 406655908ED5468CE961BB85AB39C8A7 /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		5FEFA83FC675BBCA06FA6643B3D73361 /* Pods-StretchKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 45850C532D4A2D013205E34223A0DF3C /* Pods-StretchKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		67533550F6B3AC052D36BF026A0DC5A4 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24869D429F09ACFA3227C2E18B5890BD /* Configuration.swift */; };
@@ -59,10 +60,10 @@
 		779DC067311B3C70E904B56FAA72447D /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4893AA0C4CC52C0B2A7A222C417D540 /* DSL.swift */; };
 		7814702F97E0025B3FD9C509FFAC8744 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FAD2462D03C757D0F7C333E9CC3968 /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		79C3421150AEB0300D270036979B1798 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 272E81A763DF094D944F3A4E51DEAEA0 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		7AAEA47985E5A619520A4DA1FF6B7894 /* StretchKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E596616AF100CC187A81DB8966AC291 /* StretchKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		7B0DCABC7CA404EEAF4B7626E8A157DD /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 48FEC9D5A615C2DFE3E756E8D25871A8 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		7C0B0A5AFADABD47DADE8D9956B8E6D0 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F741A325D114DF7E530BDD203FB56B4 /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		7F4F540E4AE68B46DA70D5243739AF32 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B077F09D6DBE64FF23B4C78D3D7E69 /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
+		823C4785722E0BD70BA9325CBB9AB818 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345FA4F2EED3E05023DB3E3346A64EF1 /* Node.swift */; };
 		836B968E1EA15BA9CB9B2705638A2679 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE92ABC2F7B9A21F56722990F2D34E1 /* Foundation.framework */; };
 		875E14F2DC19FE4D537B0ADAFA3CA5B9 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD3C0D4239C9AF15D57728ECFF539CA /* ExampleHooks.swift */; };
 		893C84B10779FA4477B7C7D2B3D723B1 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AF3B3EFA75292B9FDDC5E6B447AEEAC /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
@@ -83,8 +84,10 @@
 		A036C8323484A5009F20DDBC73B8DFD4 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E7A4D2583FD85F7DB51543BA1D94E9 /* QuickSelectedTestSuiteBuilder.swift */; };
 		A350958D67377DE80E194D50D5F6C3B4 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D3859EAFA486485F8FA5D6B49A11D2 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		A77C011D550EFFB05C3609BFB4DAE378 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36B3C15E01EE137782FAC1B4FF87475 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
+		A7D8C1D17667CF78BE532D6935C5DEEC /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A973A3BE3D68234105E9FDC5330A73 /* Style.swift */; };
 		A971D89C528D23212F024B371F0E1718 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = C583D55E93D2C23506816D0ECC9CB0B0 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		AAD8D9F508F9CC045C4715D1F27B2A73 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 696B48A141606A71BC0ABD43B9A52D8F /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
+		ABE7C745FB526DEB0931BB1B30162EC2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE92ABC2F7B9A21F56722990F2D34E1 /* Foundation.framework */; };
 		AD6681E3DFBC3870EA1FB6AF1B94CF6E /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD691153E3D635D7044FC779C5E82DB /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		AF749D5A7AB360F4FFCAA9BB96E5065F /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E4175EF98E338D8D5D3702B8E48D7D /* URL+FileName.swift */; };
 		B256929ECC15CB5E4132E0AC72E4CD80 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E416B96F586F3EB4A1DBACB1614B452 /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
@@ -98,6 +101,7 @@
 		C425B8C3EC8C0612698840BEE599E2A4 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = C132106EC2A2B0BF3B777DF7150EC3A1 /* Example.swift */; };
 		C472DA557E7C8581DD4C6FAA91A3AEDF /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 65191C87D7890AEF4187AC979AD0E5E2 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		C5031E73785A648DB774B7B400990B70 /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1208008CFB860726BD6C3DD35E138D78 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		CAA802CA153BCFACE43786D069BB91A0 /* StretchKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B122F87FC4E995A8F62CFBE3852EE634 /* StretchKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		CB8F6C788B3B913D5DB96BECFC05A3DB /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 422D1D2C5EAA1517BC9DD050822F4A05 /* QuickSpecBase.m */; };
 		CD86215E5BC4DB5C76E575AE1A6CAB63 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039D8A83F931FBCB15CA68FFEF57A2EE /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		CF4C47CB3000F22B671837D5C6EB0C0C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE92ABC2F7B9A21F56722990F2D34E1 /* Foundation.framework */; };
@@ -114,7 +118,6 @@
 		F0A6D424C5E83532D1A828FE09588B4C /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722949AE9C9F2FA0EF6CFB37D69144B8 /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		F0EB5EDC6364CBBB8D73B9680BC5FBF6 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41AEFF6F0F8641915460E14078EAA621 /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		F10A1B92C1E050E153738C5C4BAC664F /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 68938017DBE8BABA6FF05E15B614FA9B /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F36F18695099BEA1470251DFDD39FB83 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE92ABC2F7B9A21F56722990F2D34E1 /* Foundation.framework */; };
 		F4D3C734AAF98DB3A17ECC3D6A95BC52 /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC0E8FB31B8A59EEDED9EC78DB693257 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		F72E8C9D01979824B70FBA6E7A70249F /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB983C01ACCC87D37C64FEEEBD015E6C /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
 		FAE8D9F50C5FEAF65617922C46B704C3 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACEB3B980103F727C9A633F3B80B1C75 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; };
@@ -168,16 +171,16 @@
 		23FAD2462D03C757D0F7C333E9CC3968 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = "<group>"; };
 		2450165A9350C8074899189666ECDA5C /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = "<group>"; };
 		24869D429F09ACFA3227C2E18B5890BD /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = "<group>"; };
+		25A973A3BE3D68234105E9FDC5330A73 /* Style.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Style.swift; path = bindings/swift/StretchKit/Classes/Style.swift; sourceTree = "<group>"; };
 		272E81A763DF094D944F3A4E51DEAEA0 /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = "<group>"; };
 		2934A3B4FE683A7B1077812515D6E5F0 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = "<group>"; };
 		2D7D162B345E833ED4C9DA0274A51E2C /* StretchKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = StretchKit.framework; path = StretchKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		2E416B96F586F3EB4A1DBACB1614B452 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = "<group>"; };
-		2E596616AF100CC187A81DB8966AC291 /* StretchKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StretchKit-umbrella.h"; sourceTree = "<group>"; };
 		2FD3C0D4239C9AF15D57728ECFF539CA /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = "<group>"; };
-		36296CEF6520BDFD0C09366B9857BDAB /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
+		345FA4F2EED3E05023DB3E3346A64EF1 /* Node.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Node.swift; path = bindings/swift/StretchKit/Classes/Node.swift; sourceTree = "<group>"; };
+		34B33C2F15346D17C5EF101AE861496A /* StretchKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = StretchKit.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		364E9FAB6806BBBDFD1BD4E5C7A6126F /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = "<group>"; };
 		368540D083788E46A27376E7CB7215E0 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = "<group>"; };
-		3B3583B09277C762B6610C104D184599 /* StretchKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StretchKit-prefix.pch"; sourceTree = "<group>"; };
 		3D4DE94AC94FFBF28441A0C36561FC78 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = "<group>"; };
 		3E9F7D22BF5690CB87C3259789439181 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = "<group>"; };
 		3EFEEEC9948D8453804CF7F9368DEE5E /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = "<group>"; };
@@ -187,32 +190,33 @@
 		441B1D5DAE79FCCB2C541078158C4BF6 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = "<group>"; };
 		45850C532D4A2D013205E34223A0DF3C /* Pods-StretchKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StretchKit_Tests-umbrella.h"; sourceTree = "<group>"; };
 		465AE41C5EDD179EB8E2E75DDA09D54B /* Quick-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Quick-Info.plist"; sourceTree = "<group>"; };
+		47BA2A6FB0E07663CDC3EA6A18368537 /* StretchKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StretchKit-dummy.m"; sourceTree = "<group>"; };
 		48FEC9D5A615C2DFE3E756E8D25871A8 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = "<group>"; };
-		50F6A794CA3727083DBDABBF55F3845C /* ReplaceMe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaceMe.swift; path = bindings/swift/StretchKit/Classes/ReplaceMe.swift; sourceTree = "<group>"; };
 		516302BEEE3227BA3C6DAD440E033F8F /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = "<group>"; };
 		516325EA52CB6C1B56F86DEF88099275 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		5243E8433E7F4F1E8C496EC66E5F0F55 /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Quick.modulemap; sourceTree = "<group>"; };
 		5335C13471371B150AB311F6F7C968EE /* Pods-StretchKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StretchKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
 		535E72EA69AB6BFBD3D86432CBF594CD /* Pods-StretchKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StretchKit_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
 		53A1C1217C5942387C0D355107B0382E /* Pods-StretchKit_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StretchKit_Tests-Info.plist"; sourceTree = "<group>"; };
-		54A6A9C2639A3D149CE852121B54EC86 /* StretchKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = StretchKit.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		5AA48BA1D17B1B83CE23CDC2248A7701 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = "<group>"; };
 		5CB541A541AF860EEA97FE5501182862 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = "<group>"; };
 		5E5D08CBE940017CAD86816161289FE5 /* Pods_StretchKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_StretchKit_Tests.framework; path = "Pods-StretchKit_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
 		60909C72945118E784FF4AEF6450E356 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nimble.modulemap; sourceTree = "<group>"; };
 		62E7A4D2583FD85F7DB51543BA1D94E9 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = "<group>"; };
-		63E5DA746ABAC616C53C3B7B3CEBE4BD /* StretchKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StretchKit-Info.plist"; sourceTree = "<group>"; };
 		64AD8B83D74F555E11F65FFF5385A326 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = "<group>"; };
 		65191C87D7890AEF4187AC979AD0E5E2 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = "<group>"; };
 		65854C431528E8C830E8B7C38D0C07FD /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = "<group>"; };
 		68938017DBE8BABA6FF05E15B614FA9B /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = "<group>"; };
 		696B48A141606A71BC0ABD43B9A52D8F /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = "<group>"; };
+		697FAE697144A9C9E268F4E07CBAFD60 /* Layout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Layout.swift; path = bindings/swift/StretchKit/Classes/Layout.swift; sourceTree = "<group>"; };
 		6B4FE44A565B7D51777C3DCF0536EE10 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = "<group>"; };
 		6BBAA1DC1CA8B0EFC72B63DBDF6330FB /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = "<group>"; };
 		6C16292C7017193603A06ACACB75982D /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = "<group>"; };
+		6C71FAA22CDD51AB6310EA6E22FFADDF /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
 		6D46641E08F746A053C1B8D92B7A34A4 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = "<group>"; };
 		6F741A325D114DF7E530BDD203FB56B4 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = "<group>"; };
 		6FD98DB8C1AA8E2390412D61DB64864D /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+		709D2CF46B37E4505C5CC36E962D9758 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
 		722949AE9C9F2FA0EF6CFB37D69144B8 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = "<group>"; };
 		75D3859EAFA486485F8FA5D6B49A11D2 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = "<group>"; };
 		7685C4338BFBDB65073734C64E3838C1 /* Pods-StretchKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StretchKit_Tests-dummy.m"; sourceTree = "<group>"; };
@@ -222,6 +226,7 @@
 		7BD691153E3D635D7044FC779C5E82DB /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = "<group>"; };
 		7C4D831C03026C50D9C46AAA6A6A99DC /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = "<group>"; };
 		7EA4ACEB8BB07BE97686541FE31664DC /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = "<group>"; };
+		7FCEA176F15397989E60D3103E48C2E4 /* StretchKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StretchKit-prefix.pch"; sourceTree = "<group>"; };
 		80EFA2D981F85EAF6601CE6AC577D669 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = "<group>"; };
 		81F935EBD39724CDCD2E42790617701D /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = "<group>"; };
 		8248FB8AF316C9C78E22B71BC196957D /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = "<group>"; };
@@ -233,6 +238,7 @@
 		89C4E6BA342A6FC91795E2E7D80F58F6 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = "<group>"; };
 		8A2FCA7814FB7C6B002B0AC80B728826 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = "<group>"; };
 		8A457B9BDB6A97F670558A507319208B /* Nimble-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Nimble-Info.plist"; sourceTree = "<group>"; };
+		8BAF434D4F03B9C1D8C49D18DC79C197 /* libstretch.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libstretch.a; path = bindings/swift/StretchKit/Libraries/libstretch.a; sourceTree = "<group>"; };
 		8BD31630E5AF5A91E26BE84FFB08A710 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = "<group>"; };
 		8EEEBEBF7B787898DF09E2EED055400F /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = "<group>"; };
 		8F83AA747B59E2383BB6662A3B086129 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = "<group>"; };
@@ -241,21 +247,22 @@
 		94A3A522E1EFCE6A2A59F49005B74E34 /* String+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+C99ExtendedIdentifier.swift"; path = "Sources/Quick/String+C99ExtendedIdentifier.swift"; sourceTree = "<group>"; };
 		97CC26A7C8608378C3FD9889E4AD23BF /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = "<group>"; };
 		9A0D1AFC5AE24413DD273B5725D87879 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = "<group>"; };
+		9A1A530A2B9939718DD6749E00886C7C /* StretchKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = StretchKit.modulemap; sourceTree = "<group>"; };
 		9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		A0530A8F7FBFDC9F647711A1B1906204 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = "<group>"; };
+		A3A57257CA5FF2FFBC4D546E1DFEA16F /* libstretch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = libstretch.h; path = bindings/swift/StretchKit/Headers/libstretch.h; sourceTree = "<group>"; };
 		A42F9FD5967F56D0BEC6D01D8036617B /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = "<group>"; };
 		A4BBF0EC502678F53DF8E608F8A6ACAD /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = "<group>"; };
 		A4C7D88B76C4738E7B74168479A92315 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = "<group>"; };
 		A78650F56FB20B8C081C0B0A1AFEF5BC /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = "<group>"; };
 		A8313EAA34BE645217DF2852E1522C4B /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = "<group>"; };
 		A957896A3325D9065B06E8F877B18D37 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = "<group>"; };
-		AC245B889D6D310070EE5291DB4421A0 /* StretchKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StretchKit-dummy.m"; sourceTree = "<group>"; };
 		ACBC5226F7B70DA1DB008F41E4A01382 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = "<group>"; };
 		ACEB3B980103F727C9A633F3B80B1C75 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = "<group>"; };
 		AE6F209352A13BD917FF5EC0A629FFF2 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = "<group>"; };
+		B122F87FC4E995A8F62CFBE3852EE634 /* StretchKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StretchKit-umbrella.h"; sourceTree = "<group>"; };
 		B14E94646E4C206F66E9782E6E193B11 /* ElementsEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementsEqual.swift; path = Sources/Nimble/Matchers/ElementsEqual.swift; sourceTree = "<group>"; };
 		B6E258AD83036FBA23547DE0C55FBC5A /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = "<group>"; };
-		BB6F1F0DD16C3E7E05C5591755AFFECC /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
 		BB983C01ACCC87D37C64FEEEBD015E6C /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = "<group>"; };
 		C132106EC2A2B0BF3B777DF7150EC3A1 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = "<group>"; };
 		C2E47533D52832DD152803938E8A8C59 /* SatisfyAllOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAllOf.swift; path = Sources/Nimble/Matchers/SatisfyAllOf.swift; sourceTree = "<group>"; };
@@ -271,14 +278,13 @@
 		D99CADB7D855200CFC58F3E45E3E4E1E /* Pods-StretchKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StretchKit_Tests.debug.xcconfig"; sourceTree = "<group>"; };
 		DA112225FF526E65896DDDF956F74AF1 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = "<group>"; };
 		E06F79CAFC1A7C21CE9CA39591BCAAC4 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = "<group>"; };
-		E212DDCD8B2284B639D43AFC2ED0689F /* StretchKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StretchKit.xcconfig; sourceTree = "<group>"; };
 		E36B3C15E01EE137782FAC1B4FF87475 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = "<group>"; };
 		E4893AA0C4CC52C0B2A7A222C417D540 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = "<group>"; };
 		E5E4175EF98E338D8D5D3702B8E48D7D /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = "<group>"; };
 		EB7332A0B6ABF2ED2D514AA4D9D86E93 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = "<group>"; };
+		EC0F9DDB8FB539CEE426169316A51559 /* StretchKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StretchKit.xcconfig; sourceTree = "<group>"; };
 		EC1D76E5BE2C06FDC8DD47B8BFBAE133 /* Await.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Await.swift; path = Sources/Nimble/Utils/Await.swift; sourceTree = "<group>"; };
 		EE2CBFD5F43ED31F0DDCC57F9EC33207 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = "<group>"; };
-		EEC9020DA506CC4A77D108E822C5CD06 /* StretchKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = StretchKit.modulemap; sourceTree = "<group>"; };
 		EF20CB0D6D12D898151E14B8FCC6A689 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = "<group>"; };
 		EF37E74A9438A098FCB61CE88B18A3DF /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = "<group>"; };
 		F13F7B116AF8EB86D89CA43A8D15C927 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = "<group>"; };
@@ -286,23 +292,24 @@
 		F6B1895FACA2B4330622FD41C6F39486 /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = "<group>"; };
 		FBFD1878741EFB3E1F1940591412D528 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = "<group>"; };
 		FC0E8FB31B8A59EEDED9EC78DB693257 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = "<group>"; };
+		FD1286F68D127684481D95ABE89E249B /* StretchKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StretchKit-Info.plist"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		1EEB312708EE681FF2C2CAEDA06DFB6E /* Frameworks */ = {
+		3F5152C2C3B861B9F6CA92DAE5050FA1 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				F36F18695099BEA1470251DFDD39FB83 /* Foundation.framework in Frameworks */,
+				5ADD44A9A1DEE51ECC6712E2ECC9420E /* Foundation.framework in Frameworks */,
+				45BC601FADAD02057F4B0E387E5F6F9A /* XCTest.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		3F5152C2C3B861B9F6CA92DAE5050FA1 /* Frameworks */ = {
+		548F2433C7F6FA78AC50B65960B07F75 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				5ADD44A9A1DEE51ECC6712E2ECC9420E /* Foundation.framework in Frameworks */,
-				45BC601FADAD02057F4B0E387E5F6F9A /* XCTest.framework in Frameworks */,
+				ABE7C745FB526DEB0931BB1B30162EC2 /* Foundation.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -325,6 +332,20 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		025D4430E1350E4F578817EC205A2A42 /* StretchKit */ = {
+			isa = PBXGroup;
+			children = (
+				697FAE697144A9C9E268F4E07CBAFD60 /* Layout.swift */,
+				345FA4F2EED3E05023DB3E3346A64EF1 /* Node.swift */,
+				25A973A3BE3D68234105E9FDC5330A73 /* Style.swift */,
+				409722A135D1A8827BB6BF592CE207A6 /* Pod */,
+				8C0654F4BFCBEC5968E93F08CEB97ED1 /* StretchCore */,
+				BAB1DD0D71B4823137330EC1D712C85A /* Support Files */,
+			);
+			name = StretchKit;
+			path = ../../../..;
+			sourceTree = "<group>";
+		};
 		1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
@@ -344,6 +365,16 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
+		409722A135D1A8827BB6BF592CE207A6 /* Pod */ = {
+			isa = PBXGroup;
+			children = (
+				6C71FAA22CDD51AB6310EA6E22FFADDF /* LICENSE */,
+				709D2CF46B37E4505C5CC36E962D9758 /* README.md */,
+				34B33C2F15346D17C5EF101AE861496A /* StretchKit.podspec */,
+			);
+			name = Pod;
+			sourceTree = "<group>";
+		};
 		4834F4751D2881783C5B5493BD5A931B /* Quick */ = {
 			isa = PBXGroup;
 			children = (
@@ -391,14 +422,20 @@
 			name = "Targets Support Files";
 			sourceTree = "<group>";
 		};
-		7E51898782419AF7D3908FD62F6506A0 /* Pod */ = {
+		6C80168EFCB94D1466C279D3C4061792 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				BB6F1F0DD16C3E7E05C5591755AFFECC /* LICENSE */,
-				36296CEF6520BDFD0C09366B9857BDAB /* README.md */,
-				54A6A9C2639A3D149CE852121B54EC86 /* StretchKit.podspec */,
+				8BAF434D4F03B9C1D8C49D18DC79C197 /* libstretch.a */,
 			);
-			name = Pod;
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		7CC204DF9EEA610D9F1323677D892D45 /* Development Pods */ = {
+			isa = PBXGroup;
+			children = (
+				025D4430E1350E4F578817EC205A2A42 /* StretchKit */,
+			);
+			name = "Development Pods";
 			sourceTree = "<group>";
 		};
 		872CAA7308FB8E3BA778FF2F77E73ABB /* Pods-StretchKit_Tests */ = {
@@ -418,15 +455,13 @@
 			path = "Target Support Files/Pods-StretchKit_Tests";
 			sourceTree = "<group>";
 		};
-		9D4263E477B85A04AA2A929D1ABE507C /* StretchKit */ = {
+		8C0654F4BFCBEC5968E93F08CEB97ED1 /* StretchCore */ = {
 			isa = PBXGroup;
 			children = (
-				50F6A794CA3727083DBDABBF55F3845C /* ReplaceMe.swift */,
-				7E51898782419AF7D3908FD62F6506A0 /* Pod */,
-				D3217182F024390A688BA67BA13616EC /* Support Files */,
+				A3A57257CA5FF2FFBC4D546E1DFEA16F /* libstretch.h */,
+				6C80168EFCB94D1466C279D3C4061792 /* Frameworks */,
 			);
-			name = StretchKit;
-			path = ../../../..;
+			name = StretchCore;
 			sourceTree = "<group>";
 		};
 		B4A20DE51C57CCE6549A26D79F664F86 /* iOS */ = {
@@ -438,6 +473,20 @@
 			name = iOS;
 			sourceTree = "<group>";
 		};
+		BAB1DD0D71B4823137330EC1D712C85A /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				9A1A530A2B9939718DD6749E00886C7C /* StretchKit.modulemap */,
+				EC0F9DDB8FB539CEE426169316A51559 /* StretchKit.xcconfig */,
+				47BA2A6FB0E07663CDC3EA6A18368537 /* StretchKit-dummy.m */,
+				FD1286F68D127684481D95ABE89E249B /* StretchKit-Info.plist */,
+				7FCEA176F15397989E60D3103E48C2E4 /* StretchKit-prefix.pch */,
+				B122F87FC4E995A8F62CFBE3852EE634 /* StretchKit-umbrella.h */,
+			);
+			name = "Support Files";
+			path = "bindings/swift/Example/Pods/Target Support Files/StretchKit";
+			sourceTree = "<group>";
+		};
 		BD2F1A6FE68DC5AF3C94418A88BB7E29 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
@@ -451,7 +500,7 @@
 			isa = PBXGroup;
 			children = (
 				9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
-				FC43DF4D08ED0DCFFAFF22D8C627ED2C /* Development Pods */,
+				7CC204DF9EEA610D9F1323677D892D45 /* Development Pods */,
 				1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */,
 				BD2F1A6FE68DC5AF3C94418A88BB7E29 /* Pods */,
 				25B2B4D6DB7AD9E4A9213558E7E3B90F /* Products */,
@@ -459,20 +508,6 @@
 			);
 			sourceTree = "<group>";
 		};
-		D3217182F024390A688BA67BA13616EC /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				EEC9020DA506CC4A77D108E822C5CD06 /* StretchKit.modulemap */,
-				E212DDCD8B2284B639D43AFC2ED0689F /* StretchKit.xcconfig */,
-				AC245B889D6D310070EE5291DB4421A0 /* StretchKit-dummy.m */,
-				63E5DA746ABAC616C53C3B7B3CEBE4BD /* StretchKit-Info.plist */,
-				3B3583B09277C762B6610C104D184599 /* StretchKit-prefix.pch */,
-				2E596616AF100CC187A81DB8966AC291 /* StretchKit-umbrella.h */,
-			);
-			name = "Support Files";
-			path = "bindings/swift/Example/Pods/Target Support Files/StretchKit";
-			sourceTree = "<group>";
-		};
 		E2697886F3CD10A152F47D611F1B1A3B /* Nimble */ = {
 			isa = PBXGroup;
 			children = (
@@ -566,14 +601,6 @@
 			path = "../Target Support Files/Quick";
 			sourceTree = "<group>";
 		};
-		FC43DF4D08ED0DCFFAFF22D8C627ED2C /* Development Pods */ = {
-			isa = PBXGroup;
-			children = (
-				9D4263E477B85A04AA2A929D1ABE507C /* StretchKit */,
-			);
-			name = "Development Pods";
-			sourceTree = "<group>";
-		};
 		FF18E9D757C04B2D9DD64D169490B0B4 /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
@@ -591,6 +618,15 @@
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
+		491305A6BAD1589B275C2792F88058C3 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5D9F154AC1DC0CFC852E684D0EE47C26 /* libstretch.h in Headers */,
+				CAA802CA153BCFACE43786D069BB91A0 /* StretchKit-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		6690559A0FA18F0752F27A511B8DAAD6 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
@@ -607,14 +643,6 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		C95B9FC43CFD57C0BF87A81FEF92D145 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				7AAEA47985E5A619520A4DA1FF6B7894 /* StretchKit-umbrella.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		CBA2707A202D1B1E850BBE92256B45C0 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
@@ -698,12 +726,12 @@
 		};
 		E1B3BA447AA09CF679D5E65C02531B03 /* StretchKit */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = B39FFCA835D39BFBA81B942819050FA3 /* Build configuration list for PBXNativeTarget "StretchKit" */;
+			buildConfigurationList = 8B67967432459EC984FFC245038C5868 /* Build configuration list for PBXNativeTarget "StretchKit" */;
 			buildPhases = (
-				C95B9FC43CFD57C0BF87A81FEF92D145 /* Headers */,
-				7CDE8651A26FAD6A0E7DEB853333F8A7 /* Sources */,
-				1EEB312708EE681FF2C2CAEDA06DFB6E /* Frameworks */,
-				9F8B55DEA7041FEC05278B9E64646D6C /* Resources */,
+				491305A6BAD1589B275C2792F88058C3 /* Headers */,
+				56289C8822801BED5418944F7F78C189 /* Sources */,
+				548F2433C7F6FA78AC50B65960B07F75 /* Frameworks */,
+				559FF470544F753B0B9DB15600C90717 /* Resources */,
 			);
 			buildRules = (
 			);
@@ -751,7 +779,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		9F8B55DEA7041FEC05278B9E64646D6C /* Resources */ = {
+		559FF470544F753B0B9DB15600C90717 /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -808,6 +836,17 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		56289C8822801BED5418944F7F78C189 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				0C26697ED9FBA7B5A8B80BF0E0861988 /* Layout.swift in Sources */,
+				823C4785722E0BD70BA9325CBB9AB818 /* Node.swift in Sources */,
+				4DBB99F8A44B24C0CEBB9221BA10647E /* StretchKit-dummy.m in Sources */,
+				A7D8C1D17667CF78BE532D6935C5DEEC /* Style.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		696291B3BF50FCD63898B3DD76DEB747 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -886,15 +925,6 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		7CDE8651A26FAD6A0E7DEB853333F8A7 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				5C6BCBDCEF1EF1B8C19B75868A8C57F5 /* ReplaceMe.swift in Sources */,
-				5A3AC5C7475B822940B9EFEF9B045FD9 /* StretchKit-dummy.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
@@ -919,39 +949,6 @@
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
-		1D38C04B5CC706C35C681287C73CCEB7 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = E212DDCD8B2284B639D43AFC2ED0689F /* StretchKit.xcconfig */;
-			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
-				CLANG_ENABLE_OBJC_WEAK = NO;
-				CODE_SIGN_IDENTITY = "";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				CURRENT_PROJECT_VERSION = 1;
-				DEFINES_MODULE = YES;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				DYLIB_INSTALL_NAME_BASE = "@rpath";
-				GCC_PREFIX_HEADER = "Target Support Files/StretchKit/StretchKit-prefix.pch";
-				INFOPLIST_FILE = "Target Support Files/StretchKit/StretchKit-Info.plist";
-				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
-				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
-				MODULEMAP_FILE = "Target Support Files/StretchKit/StretchKit.modulemap";
-				PRODUCT_MODULE_NAME = StretchKit;
-				PRODUCT_NAME = StretchKit;
-				SDKROOT = iphoneos;
-				SKIP_INSTALL = YES;
-				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
-				SWIFT_VERSION = 4.2;
-				TARGETED_DEVICE_FAMILY = "1,2";
-				VERSIONING_SYSTEM = "apple-generic";
-				VERSION_INFO_PREFIX = "";
-			};
-			name = Debug;
-		};
 		20C9A6043CF666167279CF421175F6E1 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = D99CADB7D855200CFC58F3E45E3E4E1E /* Pods-StretchKit_Tests.debug.xcconfig */;
@@ -1051,12 +1048,11 @@
 			};
 			name = Debug;
 		};
-		5A9DBD9D587400A32352CD90290C95A7 /* Release */ = {
+		50FE68CF7975EF076C67E6A3758DA5B6 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = E212DDCD8B2284B639D43AFC2ED0689F /* StretchKit.xcconfig */;
+			baseConfigurationReference = EC0F9DDB8FB539CEE426169316A51559 /* StretchKit.xcconfig */;
 			buildSettings = {
 				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
-				CLANG_ENABLE_OBJC_WEAK = NO;
 				CODE_SIGN_IDENTITY = "";
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -1069,7 +1065,7 @@
 				GCC_PREFIX_HEADER = "Target Support Files/StretchKit/StretchKit-prefix.pch";
 				INFOPLIST_FILE = "Target Support Files/StretchKit/StretchKit-Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
-				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				MODULEMAP_FILE = "Target Support Files/StretchKit/StretchKit.modulemap";
 				PRODUCT_MODULE_NAME = StretchKit;
@@ -1213,6 +1209,38 @@
 			};
 			name = Release;
 		};
+		ADEA8D43965BBDCD93EE55313511978C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = EC0F9DDB8FB539CEE426169316A51559 /* StretchKit.xcconfig */;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+				CODE_SIGN_IDENTITY = "";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				GCC_PREFIX_HEADER = "Target Support Files/StretchKit/StretchKit-prefix.pch";
+				INFOPLIST_FILE = "Target Support Files/StretchKit/StretchKit-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				MODULEMAP_FILE = "Target Support Files/StretchKit/StretchKit.modulemap";
+				PRODUCT_MODULE_NAME = StretchKit;
+				PRODUCT_NAME = StretchKit;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_VERSION = 4.2;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
 		B2F78AA1391D32EADBBA8E3A02E458F4 /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = A957896A3325D9065B06E8F877B18D37 /* Quick.xcconfig */;
@@ -1341,11 +1369,11 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		B39FFCA835D39BFBA81B942819050FA3 /* Build configuration list for PBXNativeTarget "StretchKit" */ = {
+		8B67967432459EC984FFC245038C5868 /* Build configuration list for PBXNativeTarget "StretchKit" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				1D38C04B5CC706C35C681287C73CCEB7 /* Debug */,
-				5A9DBD9D587400A32352CD90290C95A7 /* Release */,
+				ADEA8D43965BBDCD93EE55313511978C /* Debug */,
+				50FE68CF7975EF076C67E6A3758DA5B6 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
diff --git a/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.debug.xcconfig b/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.debug.xcconfig
index c196b4ae7..45365324b 100644
--- a/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.debug.xcconfig	
+++ b/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.debug.xcconfig	
@@ -4,7 +4,8 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Framewo
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/StretchKit/StretchKit.framework/Headers" ${PODS_ROOT}/StretchCore/Headers
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" -framework "StretchKit" -framework "XCTest" -weak_framework "XCTest"
+LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../StretchKit/Libraries"
+OTHER_LDFLAGS = $(inherited) -ObjC -framework "Nimble" -framework "Quick" -framework "StretchKit" -framework "XCTest" -weak_framework "XCTest"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
diff --git a/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.release.xcconfig b/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.release.xcconfig
index c196b4ae7..45365324b 100644
--- a/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.release.xcconfig	
+++ b/bindings/swift/Example/Pods/Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.release.xcconfig	
@@ -4,7 +4,8 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Framewo
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/StretchKit/StretchKit.framework/Headers" ${PODS_ROOT}/StretchCore/Headers
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" -framework "StretchKit" -framework "XCTest" -weak_framework "XCTest"
+LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../StretchKit/Libraries"
+OTHER_LDFLAGS = $(inherited) -ObjC -framework "Nimble" -framework "Quick" -framework "StretchKit" -framework "XCTest" -weak_framework "XCTest"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
diff --git a/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit-umbrella.h b/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit-umbrella.h
index b1cf2ad5b..b23b8cc30 100644
--- a/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit-umbrella.h	
+++ b/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit-umbrella.h	
@@ -10,6 +10,7 @@
 #endif
 #endif
 
+#import "libstretch.h"
 
 FOUNDATION_EXPORT double StretchKitVersionNumber;
 FOUNDATION_EXPORT const unsigned char StretchKitVersionString[];
diff --git a/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit.xcconfig b/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit.xcconfig
index 22de87059..75b8df798 100644
--- a/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit.xcconfig	
+++ b/bindings/swift/Example/Pods/Target Support Files/StretchKit/StretchKit.xcconfig	
@@ -2,6 +2,8 @@ CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StretchKit
 ENABLE_BITCODE = NO
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/StretchCore/Headers
+LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../StretchKit/Libraries"
+OTHER_LDFLAGS = $(inherited) -l"stretch"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
diff --git a/bindings/swift/Example/StretchKit.xcodeproj/project.pbxproj b/bindings/swift/Example/StretchKit.xcodeproj/project.pbxproj
index a22dbbaab..f9b16f270 100644
--- a/bindings/swift/Example/StretchKit.xcodeproj/project.pbxproj
+++ b/bindings/swift/Example/StretchKit.xcodeproj/project.pbxproj
@@ -8,7 +8,7 @@
 
 /* Begin PBXBuildFile section */
 		389F6E8D0121E5914917FB09 /* Pods_StretchKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 639978D728B12E3F3919640F /* Pods_StretchKit_Tests.framework */; };
-		607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; };
+		607FACEC1AFB9204008FA782 /* NodeSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* NodeSpec.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -16,7 +16,7 @@
 		30FC92ABE93DE856E8BCCADE /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
 		607FACE51AFB9204008FA782 /* StretchKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StretchKit_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
+		607FACEB1AFB9204008FA782 /* NodeSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeSpec.swift; sourceTree = "<group>"; };
 		639978D728B12E3F3919640F /* Pods_StretchKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StretchKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		90993DB6308A4FC1D4679EB0 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
 		B824EA499BA578E6E648CA1D /* Pods-StretchKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StretchKit_Tests.release.xcconfig"; path = "Target Support Files/Pods-StretchKit_Tests/Pods-StretchKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
@@ -57,7 +57,7 @@
 		607FACE81AFB9204008FA782 /* Tests */ = {
 			isa = PBXGroup;
 			children = (
-				607FACEB1AFB9204008FA782 /* Tests.swift */,
+				607FACEB1AFB9204008FA782 /* NodeSpec.swift */,
 				607FACE91AFB9204008FA782 /* Supporting Files */,
 			);
 			path = Tests;
@@ -133,7 +133,6 @@
 					607FACE41AFB9204008FA782 = {
 						CreatedOnToolsVersion = 6.3.1;
 						LastSwiftMigration = 0900;
-						TestTargetID = 607FACCF1AFB9204008FA782;
 					};
 				};
 			};
@@ -217,7 +216,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				607FACEC1AFB9204008FA782 /* Tests.swift in Sources */,
+				607FACEC1AFB9204008FA782 /* NodeSpec.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -347,7 +346,6 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
 				SWIFT_VERSION = 4.0;
-				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StretchKit_Example.app/StretchKit_Example";
 			};
 			name = Debug;
 		};
@@ -365,7 +363,6 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Default;
 				SWIFT_VERSION = 4.0;
-				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StretchKit_Example.app/StretchKit_Example";
 			};
 			name = Release;
 		};
diff --git a/bindings/swift/Example/Tests/NodeSpec.swift b/bindings/swift/Example/Tests/NodeSpec.swift
new file mode 100644
index 000000000..c2f78aac2
--- /dev/null
+++ b/bindings/swift/Example/Tests/NodeSpec.swift
@@ -0,0 +1,90 @@
+import Quick
+import Nimble
+import StretchKit
+
+class NodeSpec: QuickSpec {
+    override func spec() {
+        it("will create node") {
+            let child = Node(style: Style(), children: [])
+            let node = Node(style: Style(), children: [child])
+            expect(node.getChildCount()) == 1
+        }
+        
+        it("will create leaf") {
+            let node = Node(style: Style()) { constraint in
+                return Size(width: 100.0, height: 100.0)
+            }
+            
+            let layout = node.computeLayout(size: Size(width: nil, height: nil))
+            expect(layout.width) == 100.0
+            expect(layout.height) == 100.0
+        }
+        
+        it("will set measure") {
+            let node = Node(style: Style(), children: [])
+            node.setMeasure { constraint in
+                return Size(width: 100.0, height: 100.0)
+            }
+            
+            let layout = node.computeLayout(size: Size(width: nil, height: nil))
+            expect(layout.width) == 100.0
+            expect(layout.height) == 100.0
+        }
+        
+        it("will add child") {
+            let node = Node(style: Style(), children: [])
+            let child = Node(style: Style(), children: [])
+            node.addChild(child: child)
+            expect(node.getChildCount()) == 1
+        }
+        
+        it("will remove child") {
+            let child = Node(style: Style(), children: [])
+            let node = Node(style: Style(), children: [child])
+            node.removeChild(child: child)
+            expect(node.getChildCount()) == 0
+        }
+        
+        it("will remove child at index") {
+            let child = Node(style: Style(), children: [])
+            let node = Node(style: Style(), children: [child])
+            node.removeChildAtIndex(index: 0)
+            expect(node.getChildCount()) == 0
+        }
+        
+        it("will replace child at index") {
+            let child1 = Node(style: Style(size: Size(width: .points(100.0), height: .points(100.0))), children: [])
+            let child2 = Node(style: Style(size: Size(width: .points(200.0), height: .points(200.0))), children: [])
+            let node = Node(style: Style(), children: [child1])
+            node.replaceChildAtIndex(index: 0, child: child2)
+            
+            let layout = node.computeLayout(size: Size(width: nil, height: nil))
+            expect(layout.width) == 200.0
+            expect(layout.height) == 200.0
+        }
+        
+        it("will set style") {
+            let node = Node(style: Style(size: Size(width: .points(100.0), height: .points(100.0))), children: [])
+            node.setStyle(style: Style(size: Size(width: .points(200.0), height: .points(200.0))))
+            
+            let layout = node.computeLayout(size: Size(width: nil, height: nil))
+            expect(layout.width) == 200.0
+            expect(layout.height) == 200.0
+        }
+        
+        it("will set children") {
+            let node = Node(style: Style(), children: [])
+            let child = Node(style: Style(), children: [])
+            node.setChildren(children: [child])
+            expect(node.getChildCount()) == 1
+        }
+        
+        it("will mark node dirty") {
+            let node = Node(style: Style(), children: [])
+            let _ = node.computeLayout(size: Size(width: nil, height: nil))
+            expect(node.isDirty()) == false
+            node.markDirty()
+            expect(node.isDirty()) == true
+        }
+    }
+}
diff --git a/bindings/swift/Example/Tests/Tests.swift b/bindings/swift/Example/Tests/Tests.swift
deleted file mode 100644
index 924fddcb1..000000000
--- a/bindings/swift/Example/Tests/Tests.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-// https://github.com/Quick/Quick
-
-import Quick
-import Nimble
-import StretchKit
-
-class TableOfContentsSpec: QuickSpec {
-    override func spec() {
-        describe("these will fail") {
-
-            it("can do maths") {
-                expect(1) == 2
-            }
-
-            it("can read") {
-                expect("number") == "string"
-            }
-
-            it("will eventually fail") {
-                expect("time").toEventually( equal("done") )
-            }
-            
-            context("these will pass") {
-
-                it("can do maths") {
-                    expect(23) == 23
-                }
-
-                it("can read") {
-                    expect("🐮") == "🐮"
-                }
-
-                it("will eventually pass") {
-                    var time = "passing"
-
-                    DispatchQueue.main.async {
-                        time = "done"
-                    }
-
-                    waitUntil { done in
-                        Thread.sleep(forTimeInterval: 0.5)
-                        expect(time) == "done"
-
-                        done()
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/bindings/swift/StretchCore/Cargo.toml b/bindings/swift/StretchCore/Cargo.toml
new file mode 100644
index 000000000..feb73aaf4
--- /dev/null
+++ b/bindings/swift/StretchCore/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "ios-stretch"
+version = "0.1.0"
+authors = ["Emil Sjölander <emil@visly.app>"]
+edition = "2018"
+
+[dependencies]
+stretch = "0.2.2"
+
+[lib]
+name = "stretch"
+crate-type = ["staticlib"]
+
+[workspace]
+members = []
diff --git a/bindings/swift/StretchCore/src/lib.rs b/bindings/swift/StretchCore/src/lib.rs
new file mode 100644
index 000000000..aa83d95bf
--- /dev/null
+++ b/bindings/swift/StretchCore/src/lib.rs
@@ -0,0 +1,310 @@
+use std::f32;
+use std::os::raw::*;
+use stretch::node::*;
+use stretch::style::*;
+use stretch::result::{Layout};
+use stretch::geometry::*;
+use stretch::number::*;
+
+#[repr(C)]
+pub struct StretchSize {
+    width: f32,
+    height: f32,
+}
+
+#[repr(C)]
+pub struct StretchStyleDimension {
+    dimen_type: i32,
+    dimen_value: f32,
+}
+
+impl Into<Dimension> for StretchStyleDimension {
+    fn into(self) -> Dimension {
+        match self.dimen_type {
+            0 => Dimension::Points(self.dimen_value),
+            1 => Dimension::Percent(self.dimen_value),
+            2 => Dimension::Auto,
+            3 => Dimension::Undefined,
+            _ => panic!()
+        }
+    }
+}
+
+#[repr(C)]
+pub struct StretchStyleRect {
+    start: StretchStyleDimension,
+    end: StretchStyleDimension,
+    top: StretchStyleDimension,
+    bottom: StretchStyleDimension,
+}
+
+#[repr(C)]
+pub struct StretchStyleSize {
+    width: StretchStyleDimension,
+    height: StretchStyleDimension,
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_style_create(
+    display: i32,
+    position_type: i32,
+    direction: i32,
+    flex_direction: i32,
+    flex_wrap: i32,
+    overflow: i32,
+    align_items: i32,
+    align_self: i32,
+    align_content: i32,
+    justify_content: i32,
+
+    position: StretchStyleRect,
+    margin: StretchStyleRect,
+    padding: StretchStyleRect,
+    border: StretchStyleRect,
+
+    flex_grow: f32,
+    flex_shrink: f32,
+
+    flex_basis: StretchStyleDimension,
+
+    size: StretchStyleSize,
+    min_size: StretchStyleSize,
+    max_size: StretchStyleSize,
+
+    aspect_ratio: f32
+) -> *mut c_void {
+    Box::into_raw(Box::new(Style {
+        display: match display {
+            0 => Display::Flex,
+            1 => Display::None,
+            _ => panic!()
+        },
+
+        position_type: match position_type {
+            0 => PositionType::Relative,
+            1 => PositionType::Absolute,
+            _ => panic!()
+        },
+
+        direction: match direction {
+            0 => Direction::Inherit,
+            1 => Direction::LTR,
+            2 => Direction::RTL,
+            _ => panic!()
+        },
+
+        flex_direction: match flex_direction {
+            0 => FlexDirection::Row,
+            1 => FlexDirection::Column,
+            2 => FlexDirection::RowReverse,
+            3 => FlexDirection::ColumnReverse,
+            _ => panic!()
+        },
+
+        flex_wrap: match flex_wrap {
+            0 => FlexWrap::NoWrap,
+            1 => FlexWrap::Wrap,
+            2 => FlexWrap::WrapReverse,
+            _ => panic!()
+        },
+
+        overflow: match overflow {
+            0 => Overflow::Visible,
+            1 => Overflow::Hidden,
+            2 => Overflow::Scroll,
+            _ => panic!()
+        },
+
+        align_items: match align_items {
+            0 => AlignItems::FlexStart,
+            1 => AlignItems::FlexEnd,
+            2 => AlignItems::Center,
+            3 => AlignItems::Baseline,
+            4 => AlignItems::Stretch,
+            _ => panic!()
+        },
+
+        align_self: match align_self {
+            0 => AlignSelf::Auto,
+            1 => AlignSelf::FlexStart,
+            2 => AlignSelf::FlexEnd,
+            3 => AlignSelf::Center,
+            4 => AlignSelf::Baseline,
+            5 => AlignSelf::Stretch,
+            _ => panic!()
+        },
+
+        align_content: match align_content {
+            0 => AlignContent::FlexStart,
+            1 => AlignContent::FlexEnd,
+            2 => AlignContent::Center,
+            3 => AlignContent::Stretch,
+            4 => AlignContent::SpaceBetween,
+            5 => AlignContent::SpaceAround,
+            _ => panic!()
+        },
+
+        justify_content: match justify_content {
+            0 => JustifyContent::FlexStart,
+            1 => JustifyContent::FlexEnd,
+            2 => JustifyContent::Center,
+            3 => JustifyContent::SpaceBetween,
+            4 => JustifyContent::SpaceAround,
+            5 => JustifyContent::SpaceEvenly,
+            _ => panic!()
+        },
+
+        position: Rect {
+            start: position.start.into(),
+            end: position.end.into(),
+            top: position.top.into(),
+            bottom: position.bottom.into(),
+        },
+
+        margin: Rect {
+            start: margin.start.into(),
+            end: margin.end.into(),
+            top: margin.top.into(),
+            bottom: margin.bottom.into(),
+        },
+
+        padding: Rect {
+            start: padding.start.into(),
+            end: padding.end.into(),
+            top: padding.top.into(),
+            bottom: padding.bottom.into(),
+        },
+
+        border: Rect {
+            start: border.start.into(),
+            end: border.end.into(),
+            top: border.top.into(),
+            bottom: border.bottom.into(),
+        },
+
+        flex_grow,
+        flex_shrink,
+
+        flex_basis: flex_basis.into(),
+
+        size: Size { width: size.width.into(), height: size.height.into() },
+        min_size: Size { width: min_size.width.into(), height: min_size.height.into() },
+        max_size: Size { width: max_size.width.into(), height: max_size.height.into() },
+
+        aspect_ratio: if f32::is_nan(aspect_ratio) {
+            Number::Undefined
+        } else {
+            Number::Defined(aspect_ratio)
+        },
+    })) as *mut c_void
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_style_free(style: *mut c_void) {
+    let _style = unsafe { Box::from_raw(style as *mut Style) };
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_create(style: *mut c_void) -> *mut c_void {
+    let style = unsafe { Box::from_raw(style as *mut Style) };
+    Box::into_raw(Box::new(Node::new(*Box::leak(style), vec![]))) as *mut c_void
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_free(node: *mut c_void) {
+    let _node = unsafe { Box::from_raw(node as *mut Node) };
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_set_measure(node: *mut c_void, swift_ptr: *mut c_void, measure: fn(*const c_void, f32, f32) -> StretchSize) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    Box::leak(node).set_measure(Some(Box::new(move |constraint| {
+        let size = measure(
+            swift_ptr,
+            constraint.width.or_else(f32::NAN),
+            constraint.height.or_else(f32::NAN),
+        );
+        Ok(Size { width: size.width, height: size.height })
+    })));
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_set_style(node: *mut c_void, style: *mut c_void) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    let style = unsafe { Box::from_raw(style as *mut Style) };
+    Box::leak(node).set_style(*Box::leak(style));
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_dirty(node: *mut c_void) -> bool {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    Box::leak(node).dirty()
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_mark_dirty(node: *mut c_void) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    Box::leak(node).mark_dirty();
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_add_child(node: *mut c_void, child: *mut c_void) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    let child = unsafe { Box::from_raw(child as *mut Node) };
+    Box::leak(node).add_child(Box::leak(child));
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_replace_child_at_index(node: *mut c_void, index: usize, child: *mut c_void) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    let child = unsafe { Box::from_raw(child as *mut Node) };
+    Box::leak(node).replace_child_at_index(index, Box::leak(child));
+
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_remove_child(node: *mut c_void, child: *mut c_void) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    let child = unsafe { Box::from_raw(child as *mut Node) };
+    Box::leak(node).remove_child(Box::leak(child));
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_remove_child_at_index(node: *mut c_void, index: usize) {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    Box::leak(node).remove_child_at_index(index);
+}
+
+#[no_mangle]
+pub extern "C" fn stretch_node_compute_layout(node: *mut c_void, width: f32, height: f32, create_layout: fn(*const f32) -> *mut c_void) -> *mut c_void {
+    let node = unsafe { Box::from_raw(node as *mut Node) };
+    let layout = Box::leak(node).compute_layout(Size {
+        width: if f32::is_nan(width) {
+           Number::Undefined
+       } else {
+           Number::Defined(width)
+       },
+        height: if f32::is_nan(height) {
+            Number::Undefined
+        } else {
+            Number::Defined(height)
+        },
+    }).unwrap();
+
+    let mut output = vec![];
+    copy_output(&layout, &mut output);
+
+    create_layout(output.as_ptr())
+}
+
+fn copy_output(layout: &Layout, output: &mut Vec<f32>) {
+    output.push(layout.location.x);
+    output.push(layout.location.y);
+    output.push(layout.size.width);
+    output.push(layout.size.height);
+    output.push(layout.children.len() as f32);
+
+    for child in &layout.children {
+        copy_output(child, output);
+    }
+}
diff --git a/bindings/swift/StretchKit/Classes/Layout.swift b/bindings/swift/StretchKit/Classes/Layout.swift
new file mode 100644
index 000000000..6d1469bd3
--- /dev/null
+++ b/bindings/swift/StretchKit/Classes/Layout.swift
@@ -0,0 +1,44 @@
+import Foundation
+
+public class Layout {
+    public let x: Float
+    public let y: Float
+    public let width: Float
+    public let height: Float
+    public let children: Array<Layout>
+    
+    internal init(x: Float, y: Float, width: Float, height: Float, children: Array<Layout>) {
+        self.x = x
+        self.y = y
+        self.width = width
+        self.height = height
+        self.children = children
+    }
+    
+    internal static func fromFloats(_ floats: UnsafePointer<Float>) -> (UnsafePointer<Float>, Layout) {
+        let x = floats.pointee;
+        var floats = floats.advanced(by: 1)
+        
+        let y = floats.pointee
+        floats = floats.advanced(by: 1)
+        
+        let width = floats.pointee
+        floats = floats.advanced(by: 1)
+        
+        let height = floats.pointee
+        floats = floats.advanced(by: 1)
+        
+        let childCount = Int(floats.pointee)
+        floats = floats.advanced(by: 1)
+        
+        var children = [Layout]()
+        
+        for _ in 0..<childCount {
+            let child = Layout.fromFloats(floats)
+            floats = child.0
+            children.append(child.1)
+        }
+        
+        return (floats, Layout(x: x, y: y, width: width, height: height, children: children))
+    }
+}
diff --git a/bindings/swift/StretchKit/Classes/Node.swift b/bindings/swift/StretchKit/Classes/Node.swift
new file mode 100644
index 000000000..9865ce414
--- /dev/null
+++ b/bindings/swift/StretchKit/Classes/Node.swift
@@ -0,0 +1,111 @@
+import Foundation
+
+private func node_measure(_ node: UnsafeRawPointer?, _ width: Float, _ height: Float) -> StretchSize {
+    let node: Node = Unmanaged.fromOpaque(node!).takeUnretainedValue()
+    let size = node.measure!(Size(width: width.isNaN ? nil : width, height: height.isNaN ? nil : height))
+    return StretchSize(width: size.width, height: size.height)
+}
+
+private func create_layout(_ floats: UnsafePointer<Float>?) -> UnsafeMutableRawPointer? {
+    let layout = Layout.fromFloats(floats!).1
+    return Unmanaged.passRetained(layout).toOpaque()
+}
+
+public typealias MeasureFunc = (Size<Float?>) -> Size<Float>
+
+public class Node {
+    private let rustptr: UnsafeMutableRawPointer
+    private var style: Style
+    private var children: Array<Node> = []
+    internal var measure: MeasureFunc? = nil
+    
+    public init(style: Style, measure: @escaping MeasureFunc) {
+        self.rustptr = stretch_node_create(style.rustptr)
+        self.style = style
+        setMeasure(measure: measure)
+    }
+    
+    public init(style: Style, children: Array<Node>) {
+        self.rustptr = stretch_node_create(style.rustptr)
+        self.style = style
+        setChildren(children: children)
+    }
+    
+    public func setMeasure(measure: @escaping MeasureFunc) {
+        stretch_node_set_measure(rustptr, Unmanaged.passRetained(self).toOpaque(), node_measure)
+        self.measure = measure;
+    }
+    
+    public func getChildren() -> Array<Node> {
+        return self.children
+    }
+    
+    public func setChildren(children: Array<Node>) {
+        let num_children = self.children.count
+        for i in 0..<num_children {
+            removeChildAtIndex(index: num_children - 1 - i)
+        }
+        
+        for child in children {
+            addChild(child: child)
+        }
+    }
+    
+    public func addChild(child: Node) {
+        stretch_node_add_child(rustptr, child.rustptr)
+        children.append(child)
+    }
+    
+    @discardableResult
+    public func replaceChildAtIndex(index: Int, child: Node) -> Node {
+        stretch_node_replace_child_at_index(rustptr, UInt(index), child.rustptr)
+        let oldChild = children[index]
+        children[index] = child
+        return oldChild
+    }
+    
+    @discardableResult
+    public func removeChild(child: Node) -> Node {
+        stretch_node_remove_child(rustptr, child.rustptr)
+        children.removeAll { (node) -> Bool in
+            return node === child
+        }
+        return child
+    }
+    
+    @discardableResult
+    public func removeChildAtIndex(index: Int) -> Node {
+        stretch_node_remove_child_at_index(rustptr, UInt(index))
+        return children.remove(at: index)
+    }
+    
+    public func getStyle() -> Style {
+        return self.style
+    }
+    
+    public func setStyle(style: Style) {
+        stretch_node_set_style(rustptr, style.rustptr)
+        self.style = style
+    }
+    
+    public func markDirty() {
+        stretch_node_mark_dirty(rustptr)
+    }
+    
+    public func isDirty() -> Bool {
+        return stretch_node_dirty(rustptr)
+    }
+    
+    public func getChildCount() -> Int {
+        return self.children.count
+    }
+    
+    public func computeLayout(size: Size<Float?>) -> Layout {
+        let layoutPtr = stretch_node_compute_layout(
+            rustptr, size.width ?? Float.nan,
+            size.height ?? Float.nan,
+            create_layout)
+        let layout: Layout = Unmanaged.fromOpaque(layoutPtr!).takeUnretainedValue()
+        return layout
+    }
+}
diff --git a/bindings/swift/StretchKit/Classes/ReplaceMe.swift b/bindings/swift/StretchKit/Classes/ReplaceMe.swift
deleted file mode 100644
index e69de29bb..000000000
diff --git a/bindings/swift/StretchKit/Classes/Style.swift b/bindings/swift/StretchKit/Classes/Style.swift
new file mode 100644
index 000000000..112c5acac
--- /dev/null
+++ b/bindings/swift/StretchKit/Classes/Style.swift
@@ -0,0 +1,226 @@
+import Foundation
+
+public enum AlignItems: Int {
+    case flexStart
+    case flexEnd
+    case center
+    case baseline
+    case stretch
+}
+
+public enum AlignSelf: Int {
+    case auto
+    case flexStart
+    case flexEnd
+    case center
+    case baseline
+    case stretch
+}
+
+public enum AlignContent: Int {
+    case flexStart
+    case flexEnd
+    case center
+    case stretch
+    case spaceBetween
+    case spaceAround
+}
+
+public enum Direction: Int {
+    case inherit
+    case ltr
+    case rtl
+}
+
+public enum Display: Int {
+    case flex
+    case none
+}
+
+public enum FlexDirection: Int {
+    case row
+    case column
+    case rowReverse
+    case columnReverse
+}
+
+public enum JustifyContent: Int {
+    case flexStart
+    case flexEnd
+    case center
+    case spaceBetween
+    case spaceAround
+    case spaceEvenly
+}
+
+public enum Overflow: Int {
+    case visible
+    case hidden
+    case scroll
+}
+
+public enum PositionType: Int {
+    case relative
+    case absolute
+}
+
+public enum FlexWrap: Int {
+    case noWrap
+    case wrap
+    case wrapReverse
+}
+
+public enum Dimension {
+    case points(Float)
+    case percent(Float)
+    case auto
+    case undefined
+    
+    fileprivate func intoStretchValue() -> StretchStyleDimension {
+        switch self {
+        case .points(let value): return StretchStyleDimension(dimen_type: 0, dimen_value: value)
+        case .percent(let value): return StretchStyleDimension(dimen_type: 1, dimen_value: value)
+        case .auto: return StretchStyleDimension(dimen_type: 2, dimen_value: 0.0)
+        case .undefined: return StretchStyleDimension(dimen_type: 3, dimen_value: 0.0)
+        }
+    }
+}
+
+public struct Size<T> {
+    public let width: T
+    public let height: T
+    
+    public init(width: T, height: T) {
+        self.width = width
+        self.height = height
+    }
+}
+
+public struct Rect<T> {
+    public let start: T
+    public let end: T
+    public let top: T
+    public let bottom: T
+    
+    public init(start: T, end: T, top: T, bottom: T) {
+        self.start = start
+        self.end = end
+        self.top = top
+        self.bottom = bottom
+    }
+}
+
+public class Style {
+    internal let rustptr: UnsafeMutableRawPointer
+    
+    public let display: Display
+    public let positionType: PositionType
+    public let direction: Direction
+    public let flexDirection: FlexDirection
+    public let flexWrap: FlexWrap
+    public let overflow: Overflow
+    public let alignItems: AlignItems
+    public let alignSelf: AlignSelf
+    public let alignContent: AlignContent
+    public let justifyContent: JustifyContent
+    public let position: Rect<Dimension>
+    public let margin: Rect<Dimension>
+    public let padding: Rect<Dimension>
+    public let border: Rect<Dimension>
+    public let flexGrow: Float
+    public let flexShrink: Float
+    public let flexBasis: Dimension
+    public let size: Size<Dimension>
+    public let minSize: Size<Dimension>
+    public let maxSize: Size<Dimension>
+    public let aspectRatio: Float?
+    
+    public init(
+        display: Display = .flex,
+        positionType: PositionType = .relative,
+        direction: Direction = .inherit,
+        flexDirection: FlexDirection = .row,
+        flexWrap: FlexWrap = .noWrap,
+        overflow: Overflow = .hidden,
+        alignItems: AlignItems = .stretch,
+        alignSelf: AlignSelf = .auto,
+        alignContent: AlignContent = .flexStart,
+        justifyContent: JustifyContent = .flexStart,
+        position: Rect<Dimension> = Rect(start: .undefined, end: .undefined, top: .undefined, bottom: .undefined),
+        margin: Rect<Dimension> = Rect(start: .undefined, end: .undefined, top: .undefined, bottom: .undefined),
+        padding: Rect<Dimension> = Rect(start: .undefined, end: .undefined, top: .undefined, bottom: .undefined),
+        border: Rect<Dimension> = Rect(start: .undefined, end: .undefined, top: .undefined, bottom: .undefined),
+        flexGrow: Float = 0.0,
+        flexShrink: Float = 1.0,
+        flexBasis: Dimension = .auto,
+        size: Size<Dimension> = Size(width: .auto, height: .auto),
+        minSize: Size<Dimension> = Size(width: .auto, height: .auto),
+        maxSize: Size<Dimension> = Size(width: .auto, height: .auto),
+        aspectRatio: Float? = nil
+    ) {
+        self.display = display
+        self.positionType = positionType
+        self.direction = direction
+        self.flexDirection = flexDirection
+        self.flexWrap = flexWrap
+        self.overflow = overflow
+        self.alignItems = alignItems
+        self.alignSelf = alignSelf
+        self.alignContent = alignContent
+        self.justifyContent = justifyContent
+        self.position = position
+        self.margin = margin
+        self.padding = padding
+        self.border = border
+        self.flexGrow = flexGrow
+        self.flexShrink = flexShrink
+        self.flexBasis = flexBasis
+        self.size = size
+        self.minSize = minSize
+        self.maxSize = maxSize
+        self.aspectRatio = aspectRatio
+        
+        self.rustptr = stretch_style_create(
+            Int32(display.rawValue),
+            Int32(positionType.rawValue),
+            Int32(direction.rawValue),
+            Int32(flexDirection.rawValue),
+            Int32(flexWrap.rawValue),
+            Int32(overflow.rawValue),
+            Int32(alignItems.rawValue),
+            Int32(alignSelf.rawValue),
+            Int32(alignContent.rawValue),
+            Int32(justifyContent.rawValue),
+            StretchStyleRect(
+                start: position.start.intoStretchValue(),
+                end: position.end.intoStretchValue(),
+                top: position.top.intoStretchValue(),
+                bottom: position.bottom.intoStretchValue()
+            ),
+            StretchStyleRect(
+                start: margin.start.intoStretchValue(),
+                end: margin.end.intoStretchValue(),
+                top: margin.top.intoStretchValue(),
+                bottom: margin.bottom.intoStretchValue()
+            ),
+            StretchStyleRect(
+                start: padding.start.intoStretchValue(),
+                end: padding.end.intoStretchValue(),
+                top: padding.top.intoStretchValue(),
+                bottom: padding.bottom.intoStretchValue()
+            ),
+            StretchStyleRect(
+                start: border.start.intoStretchValue(),
+                end: border.end.intoStretchValue(),
+                top: border.top.intoStretchValue(),
+                bottom: border.bottom.intoStretchValue()
+            ),
+            flexGrow,
+            flexShrink,
+            flexBasis.intoStretchValue(),
+            StretchStyleSize(width: size.width.intoStretchValue(), height: size.height.intoStretchValue()),
+            StretchStyleSize(width: minSize.width.intoStretchValue(), height: minSize.height.intoStretchValue()),
+            StretchStyleSize(width: maxSize.width.intoStretchValue(), height: maxSize.height.intoStretchValue()),
+            aspectRatio ?? Float.nan)
+    }
+}
diff --git a/bindings/swift/StretchKit/Headers/libstretch.h b/bindings/swift/StretchKit/Headers/libstretch.h
new file mode 100644
index 000000000..fda8b4b72
--- /dev/null
+++ b/bindings/swift/StretchKit/Headers/libstretch.h
@@ -0,0 +1,76 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+typedef struct {
+  float width;
+  float height;
+} StretchSize;
+
+typedef struct {
+  int32_t dimen_type;
+  float dimen_value;
+} StretchStyleDimension;
+
+typedef struct {
+  StretchStyleDimension start;
+  StretchStyleDimension end;
+  StretchStyleDimension top;
+  StretchStyleDimension bottom;
+} StretchStyleRect;
+
+typedef struct {
+  StretchStyleDimension width;
+  StretchStyleDimension height;
+} StretchStyleSize;
+
+void stretch_node_add_child(void *node, void *child);
+
+void *stretch_node_compute_layout(void *node,
+                                  float width,
+                                  float height,
+                                  void *(*create_layout)(const float*));
+
+void *stretch_node_create(void *style);
+
+bool stretch_node_dirty(void *node);
+
+void stretch_node_free(void *node);
+
+void stretch_node_mark_dirty(void *node);
+
+void stretch_node_remove_child(void *node, void *child);
+
+void stretch_node_remove_child_at_index(void *node, uintptr_t index);
+
+void stretch_node_replace_child_at_index(void *node, uintptr_t index, void *child);
+
+void stretch_node_set_measure(void *node,
+                              void *swift_ptr,
+                              StretchSize (*measure)(const void*, float, float));
+
+void stretch_node_set_style(void *node, void *style);
+
+void *stretch_style_create(int32_t display,
+                           int32_t position_type,
+                           int32_t direction,
+                           int32_t flex_direction,
+                           int32_t flex_wrap,
+                           int32_t overflow,
+                           int32_t align_items,
+                           int32_t align_self,
+                           int32_t align_content,
+                           int32_t justify_content,
+                           StretchStyleRect position,
+                           StretchStyleRect margin,
+                           StretchStyleRect padding,
+                           StretchStyleRect border,
+                           float flex_grow,
+                           float flex_shrink,
+                           StretchStyleDimension flex_basis,
+                           StretchStyleSize size,
+                           StretchStyleSize min_size,
+                           StretchStyleSize max_size,
+                           float aspect_ratio);
+
+void stretch_style_free(void *style);
diff --git a/bindings/swift/StretchKit/Libraries/libstretch.a b/bindings/swift/StretchKit/Libraries/libstretch.a
new file mode 100644
index 000000000..ea2ecb13a
Binary files /dev/null and b/bindings/swift/StretchKit/Libraries/libstretch.a differ
diff --git a/bindings/swift/install_libraries.sh b/bindings/swift/install_libraries.sh
new file mode 100755
index 000000000..d5e470304
--- /dev/null
+++ b/bindings/swift/install_libraries.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+STRETCHKIT=../StretchKit
+
+cd $(dirname $0)/StretchCore
+cargo lipo --release
+rm -rf $STRETCHKIT/Libraries $STRETCHKIT/Headers
+mkdir $STRETCHKIT/Libraries $STRETCHKIT/Headers
+cp target/universal/release/libstretch.a $STRETCHKIT/Libraries/libstretch.a
+cbindgen . -o $STRETCHKIT/Headers/libstretch.h -l c
\ No newline at end of file