From ad8193ee8678d8a8d58498afb96ae7687af3c9b4 Mon Sep 17 00:00:00 2001 From: Samuel Beek Date: Thu, 29 Sep 2016 13:32:46 +0200 Subject: [PATCH 1/4] Update swift 3.0 --- Cartfile.resolved | 4 +- DataSourceable.xcodeproj/project.pbxproj | 21 +++++++++- .../xcschemes/DataSourceable.xcscheme | 2 +- .../xcschemes/xcschememanagement.plist | 19 +++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 28610 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 +++ DataSourceable/CellProviding.swift | 4 +- DataSourceable/CollectionViewDataSource.swift | 32 +++++++-------- .../CollectionViewDataSourceProxy.swift | 16 ++++---- DataSourceable/ElementsContaining.swift | 2 +- DataSourceable/Loadable.swift | 14 +++---- DataSourceable/Sectionable.swift | 8 ++-- DataSourceable/State.swift | 30 +++++++------- DataSourceable/TableViewDataSource.swift | 32 +++++++-------- DataSourceable/TableViewDataSourceProxy.swift | 16 ++++---- .../CollectionViewDataSourceableSpec.swift | 20 ++++----- DataSourceableTests/DataSourceTypeSpec.swift | 2 +- DataSourceableTests/LoadableSpec.swift | 28 +++++++------ DataSourceableTests/SectionableSpec.swift | 6 +-- .../TableViewDataSourceableSpec.swift | 38 +++++++++--------- README.playground/Contents.swift | 9 +++-- 21 files changed, 177 insertions(+), 131 deletions(-) create mode 100644 DataSourceable.xcodeproj/xcuserdata/samuelbeek.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Cartfile.resolved b/Cartfile.resolved index e629cf5..06a76c1 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,2 +1,2 @@ -github "Quick/Nimble" "v4.0.1" -github "Quick/Quick" "v0.9.2" +github "Quick/Nimble" "v5.0.0" +github "Quick/Quick" "v0.10.0" diff --git a/DataSourceable.xcodeproj/project.pbxproj b/DataSourceable.xcodeproj/project.pbxproj index 71ca6b6..40fb267 100644 --- a/DataSourceable.xcodeproj/project.pbxproj +++ b/DataSourceable.xcodeproj/project.pbxproj @@ -243,14 +243,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Zeker Waar"; TargetAttributes = { B3E89A821BCCDFB900C0FB4C = { CreatedOnToolsVersion = 7.0.1; + DevelopmentTeam = RS662E2L2G; + LastSwiftMigration = 0800; }; B3E89A8C1BCCDFBA00C0FB4C = { CreatedOnToolsVersion = 7.0.1; + DevelopmentTeam = RS662E2L2G; + LastSwiftMigration = 0800; }; }; }; @@ -368,8 +372,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -416,8 +422,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -437,6 +445,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -448,7 +457,9 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RS662E2L2G; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -460,6 +471,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -467,7 +479,9 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = RS662E2L2G; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -478,12 +492,14 @@ PRODUCT_BUNDLE_IDENTIFIER = nl.zekerwaar.DataSourceable; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; B3E89A9B1BCCDFBA00C0FB4C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = RS662E2L2G; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -492,12 +508,14 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = nl.zekerwaar.DataSourceableTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; B3E89A9C1BCCDFBA00C0FB4C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = RS662E2L2G; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -506,6 +524,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = nl.zekerwaar.DataSourceableTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/DataSourceable.xcodeproj/xcshareddata/xcschemes/DataSourceable.xcscheme b/DataSourceable.xcodeproj/xcshareddata/xcschemes/DataSourceable.xcscheme index a604f79..9f71152 100644 --- a/DataSourceable.xcodeproj/xcshareddata/xcschemes/DataSourceable.xcscheme +++ b/DataSourceable.xcodeproj/xcshareddata/xcschemes/DataSourceable.xcscheme @@ -1,6 +1,6 @@ + + + + SuppressBuildableAutocreation + + B3E89A821BCCDFB900C0FB4C + + primary + + + B3E89A8C1BCCDFBA00C0FB4C + + primary + + + + + diff --git a/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate b/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5a98acac66174cd5c2bffb66e276ce7727e24afd GIT binary patch literal 28610 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 A-2eap literal 0 HcmV?d00001 diff --git a/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ed9a9b4 --- /dev/null +++ b/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/DataSourceable/CellProviding.swift b/DataSourceable/CellProviding.swift index 68f3aac..50ee220 100644 --- a/DataSourceable/CellProviding.swift +++ b/DataSourceable/CellProviding.swift @@ -7,7 +7,7 @@ // public protocol CellProviding { - func reuseIdentifier(forIndexPath indexPath: NSIndexPath) -> String + func reuseIdentifier(forIndexPath indexPath: IndexPath) -> String } public protocol TableViewCellProviding: CellProviding { @@ -16,4 +16,4 @@ public protocol TableViewCellProviding: CellProviding { public protocol CollectionViewCellProviding: CellProviding { associatedtype CollectionViewCellType: Configurable -} \ No newline at end of file +} diff --git a/DataSourceable/CollectionViewDataSource.swift b/DataSourceable/CollectionViewDataSource.swift index 2e4ed3d..a1d99af 100644 --- a/DataSourceable/CollectionViewDataSource.swift +++ b/DataSourceable/CollectionViewDataSource.swift @@ -7,47 +7,47 @@ // public protocol CollectionViewDataSource { - func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int - func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell - func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int - func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView - func collectionView(collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: NSIndexPath) -> Bool - func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int + func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: IndexPath) -> UICollectionViewCell + func numberOfSectionsInCollectionView(_ collectionView: UICollectionView) -> Int + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: IndexPath) -> UICollectionReusableView + func collectionView(_ collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: IndexPath) -> Bool + func collectionView(_ collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: IndexPath, toIndexPath destinationIndexPath: IndexPath) } public extension CollectionViewDataSource { - func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + func numberOfSectionsInCollectionView(_ collectionView: UICollectionView) -> Int { return 1 } - func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { - return collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "", forIndexPath: indexPath) + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: IndexPath) -> UICollectionReusableView { + return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "", for: indexPath) } - func collectionView(collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: NSIndexPath) -> Bool { + func collectionView(_ collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: IndexPath) -> Bool { return false } - func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { + func collectionView(_ collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: IndexPath, toIndexPath destinationIndexPath: IndexPath) { } } public extension CollectionViewDataSource where Self: Sectionable { - func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return numberOfItems(inSection: section) } - func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + func numberOfSectionsInCollectionView(_ collectionView: UICollectionView) -> Int { return numberOfSections } } public extension CollectionViewDataSource where Self: Sectionable, Self: CollectionViewCellProviding, Self.CollectionViewCellType.ItemType == Self.Section.Data.Element { - func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: IndexPath) -> UICollectionViewCell { let identifier = reuseIdentifier(forIndexPath: indexPath) guard let item = item(atIndexPath: indexPath) else { return UICollectionViewCell() } - let cell = collectionView.dequeueReusableCellWithReuseIdentifier(identifier, forIndexPath: indexPath) - if let cell = cell as? CollectionViewCellType, view = collectionView as? CollectionViewCellType.ContainingViewType { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) + if let cell = cell as? CollectionViewCellType, let view = collectionView as? CollectionViewCellType.ContainingViewType { cell.configure(forItem: item, inView: view) } return cell diff --git a/DataSourceable/CollectionViewDataSourceProxy.swift b/DataSourceable/CollectionViewDataSourceProxy.swift index 4e7554f..c6db447 100644 --- a/DataSourceable/CollectionViewDataSourceProxy.swift +++ b/DataSourceable/CollectionViewDataSourceProxy.swift @@ -6,32 +6,32 @@ // Copyright © 2015 Zeker Waar. All rights reserved. // -public class CollectionViewDataSourceProxy: NSObject, UICollectionViewDataSource { - public let dataSource: CollectionViewDataSource +open class CollectionViewDataSourceProxy: NSObject, UICollectionViewDataSource { + open let dataSource: CollectionViewDataSource public init(dataSource: CollectionViewDataSource) { self.dataSource = dataSource } - public func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dataSource.collectionView(collectionView, numberOfItemsInSection: section) } - public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { return dataSource.collectionView(collectionView, cellForItemAtIndexPath: indexPath) } - public func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + open func numberOfSections(in collectionView: UICollectionView) -> Int { return dataSource.numberOfSectionsInCollectionView(collectionView) } - public func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { + open func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { return dataSource.collectionView(collectionView, viewForSupplementaryElementOfKind: kind, atIndexPath: indexPath) } - public func collectionView(collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: NSIndexPath) -> Bool { + open func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool { return dataSource.collectionView(collectionView, canMoveItemAtIndexPath: indexPath) } - public func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { + open func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { return dataSource.collectionView(collectionView, moveItemAtIndexPath: sourceIndexPath, toIndexPath: destinationIndexPath) } } diff --git a/DataSourceable/ElementsContaining.swift b/DataSourceable/ElementsContaining.swift index 911645b..0429eaf 100644 --- a/DataSourceable/ElementsContaining.swift +++ b/DataSourceable/ElementsContaining.swift @@ -12,7 +12,7 @@ public protocol ElementsContaining { subscript(index: Int) -> Element? { get } } -extension Indexable where Index == Int { +extension Collection where Index == Int { var count: Int { return endIndex } diff --git a/DataSourceable/Loadable.swift b/DataSourceable/Loadable.swift index 0ce7a1c..d70707e 100644 --- a/DataSourceable/Loadable.swift +++ b/DataSourceable/Loadable.swift @@ -7,24 +7,24 @@ // public enum Result { - case Success(Value) - case Failure(E) + case success(Value) + case failure(E) } public protocol Loadable: class { associatedtype Data : EmptyCheckable - var state: State { get set } - func loadData(completion: (Result) -> Void) + var state: State { get set } + func loadData(_ completion: @escaping(Result) -> Void) } public extension Loadable { - func reload(completion: () -> Void) { + func reload(_ completion: @escaping () -> Void) { state = state.toLoading() loadData { result in switch result { - case .Success(let data): + case .success(let data): self.state = self.state.toReady(data) - case .Failure(let error): + case .failure(let error): self.state = self.state.toError(error) } completion() diff --git a/DataSourceable/Sectionable.swift b/DataSourceable/Sectionable.swift index ed2fa55..f98b0aa 100644 --- a/DataSourceable/Sectionable.swift +++ b/DataSourceable/Sectionable.swift @@ -14,7 +14,7 @@ public protocol Sectionable { public protocol SectionCreating: Sectionable { associatedtype Data var data: Data? { get } - func createSections(data: Data) -> [Section] + func createSections(_ data: Data) -> [Section] } public extension Sectionable { @@ -33,8 +33,8 @@ public extension Sectionable { return section(atIndex: sectionIndex)?.numberOfItems ?? 0 } - func item(atIndexPath indexPath: NSIndexPath) -> Section.Data.Element? { - return section(atIndex: indexPath.section)?.item(atIndex: indexPath.row) + func item(atIndexPath indexPath: IndexPath) -> Section.Data.Element? { + return section(atIndex: (indexPath as NSIndexPath).section)?.item(atIndex: (indexPath as NSIndexPath).row) } func sectionHeader(atIndex index: Int) -> String? { @@ -62,4 +62,4 @@ public extension Sectionable where Self : DataContaining, Self.Data == [Section] var sections: [Section]? { return data } -} \ No newline at end of file +} diff --git a/DataSourceable/State.swift b/DataSourceable/State.swift index a443812..efd266b 100644 --- a/DataSourceable/State.swift +++ b/DataSourceable/State.swift @@ -7,23 +7,23 @@ // public enum State { - case Empty - case Loading(D?) - case Ready(D) + case empty + case loading(D?) + case ready(D) case Error(E,D?) public func toLoading() -> State { switch self { - case .Ready(let oldData): - return .Loading(oldData) + case .ready(let oldData): + return .loading(oldData) default: - return .Loading(nil) + return .loading(nil) } } - public func toError(error:E) -> State { + public func toError(_ error:E) -> State { switch self { - case .Loading(let oldData): + case .loading(let oldData): return .Error(error,oldData) default: assert(false, "Invalid state transition to .Error from other than .Loading") @@ -31,13 +31,13 @@ public enum State { } } - public func toReady(data: D) -> State { + public func toReady(_ data: D) -> State { switch self { - case .Loading: + case .loading: if data.isEmpty { - return .Empty + return .empty } else { - return .Ready(data) + return .ready(data) } default: assert(false, "Invalid state transition to .Ready from other than .Loading") @@ -47,11 +47,11 @@ public enum State { public var data: D? { switch self { - case .Empty: + case .empty: return nil - case .Ready(let data): + case .ready(let data): return data - case .Loading(let data): + case .loading(let data): return data case .Error(_, let data): return data diff --git a/DataSourceable/TableViewDataSource.swift b/DataSourceable/TableViewDataSource.swift index 84d35c0..ef6eb3d 100644 --- a/DataSourceable/TableViewDataSource.swift +++ b/DataSourceable/TableViewDataSource.swift @@ -7,41 +7,41 @@ // public protocol TableViewDataSource { - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell - func numberOfSectionsInTableView(tableView: UITableView) -> Int - func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? - func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int + func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell + func numberOfSectionsInTableView(_ tableView: UITableView) -> Int + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? + func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? } public extension TableViewDataSource { - public func numberOfSectionsInTableView(tableView: UITableView) -> Int { + public func numberOfSectionsInTableView(_ tableView: UITableView) -> Int { return 1 } - public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return nil } - public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { + public func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { return nil } } public extension TableViewDataSource where Self: Sectionable { - public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return numberOfItems(inSection: section) } - public func numberOfSectionsInTableView(tableView: UITableView) -> Int { + public func numberOfSectionsInTableView(_ tableView: UITableView) -> Int { return numberOfSections } - public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sectionHeader(atIndex: section) } - public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { + public func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { return sectionFooter(atIndex: section) } } @@ -50,13 +50,13 @@ public extension TableViewDataSource where Self: Sectionable { public extension TableViewDataSource where Self: Sectionable, Self: TableViewCellProviding, Self.TableViewCellType.ItemType == Self.Section.Data.Element { - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell { let identifier = reuseIdentifier(forIndexPath: indexPath) guard let item = item(atIndexPath: indexPath) else { - return tableView.dequeueReusableCellWithIdentifier(identifier) ?? UITableViewCell() + return tableView.dequeueReusableCell(withIdentifier: identifier) ?? UITableViewCell() } - let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath) - if let cell = cell as? TableViewCellType, view = tableView as? TableViewCellType.ContainingViewType { + let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) + if let cell = cell as? TableViewCellType, let view = tableView as? TableViewCellType.ContainingViewType { cell.configure(forItem: item, inView: view) } return cell diff --git a/DataSourceable/TableViewDataSourceProxy.swift b/DataSourceable/TableViewDataSourceProxy.swift index dfdd122..28838db 100644 --- a/DataSourceable/TableViewDataSourceProxy.swift +++ b/DataSourceable/TableViewDataSourceProxy.swift @@ -6,30 +6,30 @@ // Copyright © 2015 Zeker Waar. All rights reserved. // -public class TableViewDataSourceProxy: NSObject, UITableViewDataSource { - public let dataSource: TableViewDataSource +open class TableViewDataSourceProxy: NSObject, UITableViewDataSource { + open let dataSource: TableViewDataSource public init(dataSource: TableViewDataSource) { self.dataSource = dataSource } - public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataSource.tableView(tableView, numberOfRowsInSection: section) } - public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return dataSource.tableView(tableView, cellForRowAtIndexPath: indexPath) } - public func numberOfSectionsInTableView(tableView: UITableView) -> Int { + open func numberOfSections(in tableView: UITableView) -> Int { return dataSource.numberOfSectionsInTableView(tableView) } - public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + open func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return dataSource.tableView(tableView, titleForHeaderInSection: section) } - public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { + open func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { return dataSource.tableView(tableView, titleForFooterInSection: section) } -} \ No newline at end of file +} diff --git a/DataSourceableTests/CollectionViewDataSourceableSpec.swift b/DataSourceableTests/CollectionViewDataSourceableSpec.swift index 5f0b828..1c99fed 100644 --- a/DataSourceableTests/CollectionViewDataSourceableSpec.swift +++ b/DataSourceableTests/CollectionViewDataSourceableSpec.swift @@ -13,9 +13,9 @@ import Nimble struct SimpleCollectionViewDataSource: CollectionViewDataSourceable { typealias ItemType = UIColor - var sections: [[UIColor]]? = [[UIColor.redColor(),UIColor.blueColor(),UIColor.greenColor()],[UIColor.blackColor(),UIColor.whiteColor()],[UIColor.yellowColor(),UIColor.purpleColor(),UIColor.orangeColor(),UIColor.magentaColor()]] + var sections: [[UIColor]]? = [[.red, .blue, .green],[.black, .white],[.yellow,.purple,.orange,.magenta]] - func reuseIdentifier(forIndexPath indexPath: NSIndexPath) -> String { + func reuseIdentifier(forIndexPath indexPath: IndexPath) -> String { return "identifier" } } @@ -35,8 +35,8 @@ extension SimpleCollectionViewDataSource: CollectionViewCellProviding { class CollectionViewDataSourceableSpec: QuickSpec { override func spec() { describe("CollectionViewDataSourceable") { - let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: UICollectionViewFlowLayout()) - collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "identifier") + let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout()) + collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "identifier") context("with a simple tableview data source") { let simpleDataSource = SimpleCollectionViewDataSource() let proxy = CollectionViewDataSourceProxy(dataSource: simpleDataSource) @@ -50,22 +50,22 @@ class CollectionViewDataSourceableSpec: QuickSpec { } describe("numberOfSectionsInCollectionView") { it("should return 0") { - expect(collectionView.dataSource!.numberOfSectionsInCollectionView!(collectionView)).to(equal(3)) + expect(collectionView.dataSource!.numberOfSections!(in: collectionView)).to(equal(3)) } } describe("cellForItemAtIndexPath") { it("should return the configured cell") { - for section in 0.. = .Empty - func loadData(completion: (Result<[Int],ErrorType>) -> Void) { - dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) { - completion(Result.Success(self.fixtureData)) + var state: State<[Int],Error> = .empty + func loadData(_ completion: @escaping (Result<[Int],Error>) -> Void) { + DispatchQueue.global().async { + completion(Result.success(self.fixtureData)) } } init(fixtureData: [Int]) { @@ -28,18 +28,20 @@ class LoadingDataSource: Loadable { } class FailingDataSource: LoadingDataSource { - override func loadData(completion: (Result<[Int],ErrorType>) -> Void) { - completion(Result.Failure(Error.Fail)) + + override func loadData(_ completion: @escaping (Result<[Int],Error>) -> Void) { + completion(Result.failure(DataSourcableError.fail)) } + } extension State: Equatable {} public func ==(lhs: State, rhs: State) -> Bool { switch (lhs,rhs) { - case (.Empty,.Empty): return true - case (.Loading,.Loading): return true - case (.Ready,.Ready): return true + case (.empty,.empty): return true + case (.loading,.loading): return true + case (.ready,.ready): return true case (.Error,.Error): return true default: return false } @@ -68,7 +70,7 @@ class LoadableSpec: QuickSpec { it("moves to the error state") { loading.reload({ }) - let errorState: State<[Int],ErrorType> = .Error(Error.Fail,nil) + let errorState: State<[Int],Error> = .Error(DataSourcableError.fail,nil) expect(loading.state).toEventually(equal(errorState)) } } diff --git a/DataSourceableTests/SectionableSpec.swift b/DataSourceableTests/SectionableSpec.swift index c01c58f..744acee 100644 --- a/DataSourceableTests/SectionableSpec.swift +++ b/DataSourceableTests/SectionableSpec.swift @@ -58,7 +58,7 @@ class SectionableSpec: QuickSpec { it("should return the right items") { for sectionIndex in 0.. String? { - return data?.keys.sort()[sectionIndex] + return data?.keys.sorted()[sectionIndex] } } @@ -34,8 +34,8 @@ extension SimpleTableViewDataSource: TableViewCellProviding { extension SimpleTableViewDataSource: SectionCreating { typealias Section = [Int] - func createSections(data: [String:[Int]]) -> [Section] { - return data.keys.sort().flatMap { data[$0] } + func createSections(_ data: [String:[Int]]) -> [Section] { + return data.keys.sorted().flatMap { data[$0] } } } @@ -59,7 +59,7 @@ extension UITableViewCell: Configurable { protocol TestTableViewSourceable: TableViewDataSourceable {} extension TestTableViewSourceable { - func reuseIdentifier(forIndexPath indexPath: NSIndexPath) -> String { + func reuseIdentifier(forIndexPath indexPath: IndexPath) -> String { return "identifier" } } @@ -67,8 +67,8 @@ extension TestTableViewSourceable { class TableViewDataSourceableSpec: QuickSpec { override func spec() { describe("TableViewDataSourceable") { - let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 100, height: 100), style: .Plain) - tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "identifier") + let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 100, height: 100), style: .plain) + tableView.register(UITableViewCell.self, forCellReuseIdentifier: "identifier") context("with a simple tableview data source") { let simpleDataSource = SimpleTableViewDataSource() let proxy = TableViewDataSourceProxy(dataSource: simpleDataSource) @@ -82,14 +82,14 @@ class TableViewDataSourceableSpec: QuickSpec { } describe("numberOfSectionsInTableView") { it("should return 0") { - expect(tableView.dataSource!.numberOfSectionsInTableView!(tableView)).to(equal(3)) + expect(tableView.dataSource!.numberOfSections!(in: tableView)).to(equal(3)) } } describe("titleForHeaderInSection") { it("should override the default implementation") { - let titles = ["a","b","c"] - for index in 0..<3 { + let sections = ["a","b","c"] + for index in 0.. String { + func reuseIdentifier(forIndexPath indexPath: IndexPath) -> String { return defaultReuseIdentifier } } @@ -33,7 +33,8 @@ extension MovieTitleDataSource: TableViewCellProviding { let tableView: UITableView = UITableView(frame: CGRect(x: 0, y: 0, width: 320, height: 500)) let dataSource = MovieTitleDataSource() let proxy = TableViewDataSourceProxy(dataSource: dataSource) -tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: defaultReuseIdentifier) +tableView.register(UITableViewCell.self, forCellReuseIdentifier: defaultReuseIdentifier) tableView.dataSource = proxy -XCPlaygroundPage.currentPage.liveView = tableView + +PlaygroundPage.current.liveView = tableView From d15863051f393c31eddd5b98d956193b128fc00a Mon Sep 17 00:00:00 2001 From: Samuel Beek Date: Thu, 29 Sep 2016 14:05:04 +0200 Subject: [PATCH 2/4] Fix title for header test --- DataSourceableTests/TableViewDataSourceableSpec.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DataSourceableTests/TableViewDataSourceableSpec.swift b/DataSourceableTests/TableViewDataSourceableSpec.swift index 4f90194..af3bf8c 100644 --- a/DataSourceableTests/TableViewDataSourceableSpec.swift +++ b/DataSourceableTests/TableViewDataSourceableSpec.swift @@ -22,9 +22,10 @@ struct SimpleTableViewDataSource: TestTableViewSourceable { typealias ItemType = Int var data: [String:[Int]]? = ["b":[2,4,8],"a":[1,1,2,3],"c":[3,6,9]] - func tableView(tableView: UITableView, titleForHeaderInSection sectionIndex: Int) -> String? { - return data?.keys.sorted()[sectionIndex] + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + return data?.keys.sorted()[section] } + } extension SimpleTableViewDataSource: TableViewCellProviding { @@ -88,7 +89,7 @@ class TableViewDataSourceableSpec: QuickSpec { describe("titleForHeaderInSection") { it("should override the default implementation") { - let sections = ["a","b","c"] + let titles = ["a","b","c"] for index in 0.. Date: Thu, 29 Sep 2016 14:10:51 +0200 Subject: [PATCH 3/4] Update .gitignore Source: https://github.com/github/gitignore/blob/master/Swift.gitignore --- .gitignore | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.gitignore b/.gitignore index b08b1c9..57d2ec9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,33 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xcuserstate +.DS_Store + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + + Carthage + From 0338563d7db6fdffb36a76bb4e721b1289e0af3f Mon Sep 17 00:00:00 2001 From: Samuel Beek Date: Thu, 29 Sep 2016 14:33:04 +0200 Subject: [PATCH 4/4] Remove xcuserdata --- .gitignore | 3 ++- .../xcschemes/xcschememanagement.plist | 19 ------------------ .../UserInterfaceState.xcuserstate | Bin 28610 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 ----- 4 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 DataSourceable.xcodeproj/xcuserdata/samuelbeek.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/.gitignore b/.gitignore index 57d2ec9..914ef36 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ xcuserdata/ *.moved-aside *.xcuserstate .DS_Store +*.swp +*.lock ## Obj-C/Swift specific *.hmap @@ -30,4 +32,3 @@ xcuserdata/ Carthage - diff --git a/DataSourceable.xcodeproj/xcuserdata/samuelbeek.xcuserdatad/xcschemes/xcschememanagement.plist b/DataSourceable.xcodeproj/xcuserdata/samuelbeek.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 247c553..0000000 --- a/DataSourceable.xcodeproj/xcuserdata/samuelbeek.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - SuppressBuildableAutocreation - - B3E89A821BCCDFB900C0FB4C - - primary - - - B3E89A8C1BCCDFBA00C0FB4C - - primary - - - - - diff --git a/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate b/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 5a98acac66174cd5c2bffb66e276ce7727e24afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28610 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 A-2eap diff --git a/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index ed9a9b4..0000000 --- a/DataSourceable.xcworkspace/xcuserdata/samuelbeek.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - -