Updating to Xcode 9 and Swift 4 #105

This commit is contained in:
Yannick Loriot 2017-09-21 08:39:55 +02:00
parent af3cef392c
commit f7f387d031
7 changed files with 61 additions and 49 deletions

View File

@ -1 +1 @@
3.1
4.0

View File

@ -305,24 +305,24 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0820;
LastUpgradeCheck = 0900;
ORGANIZATIONNAME = "Yannick Loriot";
TargetAttributes = {
CE412E8819D9A1E4000F294E = {
CreatedOnToolsVersion = 6.0.1;
DevelopmentTeam = WNK46V33W9;
LastSwiftMigration = 0800;
LastSwiftMigration = 0900;
ProvisioningStyle = Automatic;
};
CE412E9D19D9A1E4000F294E = {
CreatedOnToolsVersion = 6.0.1;
LastSwiftMigration = 0800;
LastSwiftMigration = 0900;
ProvisioningStyle = Automatic;
TestTargetID = CE412E8819D9A1E4000F294E;
};
CE8FFED51BAB4E7F00D43F38 = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0800;
LastSwiftMigration = 0900;
};
};
};
@ -471,14 +471,20 @@
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@ -518,14 +524,20 @@
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@ -560,7 +572,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.workandplay.qrcodereader;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
};
name = Debug;
};
@ -576,7 +588,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.workandplay.qrcodereader;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
};
name = Release;
};
@ -598,7 +610,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.yannickloriot.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/QRCodeReader.swift.app/QRCodeReader.swift";
};
name = Debug;
@ -618,7 +630,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.yannickloriot.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/QRCodeReader.swift.app/QRCodeReader.swift";
};
name = Release;
@ -641,7 +653,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.yannickloriot.QRCodeReader;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
@ -667,7 +679,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0820"
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
@ -36,6 +37,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"

View File

@ -32,7 +32,7 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
lazy var reader: QRCodeReader = QRCodeReader()
lazy var readerVC: QRCodeReaderViewController = {
let builder = QRCodeReaderViewControllerBuilder {
$0.reader = QRCodeReader(metadataObjectTypes: [AVMetadataObjectTypeQRCode], captureDevicePosition: .back)
$0.reader = QRCodeReader(metadataObjectTypes: [AVMetadataObject.ObjectType.qr], captureDevicePosition: .back)
$0.showTorchButton = true
}
@ -124,9 +124,7 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
}
func reader(_ reader: QRCodeReaderViewController, didSwitchCamera newCaptureDevice: AVCaptureDeviceInput) {
if let cameraName = newCaptureDevice.device.localizedName {
print("Switching capturing to: \(cameraName)")
}
print("Switching capturing to: \(newCaptureDevice.device.localizedName)")
}
func readerDidCancel(_ reader: QRCodeReaderViewController) {

View File

@ -29,15 +29,15 @@ import AVFoundation
/// Reader object base on the `AVCaptureDevice` to read / scan 1D and 2D codes.
public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegate {
var defaultDevice: AVCaptureDevice = .defaultDevice(withMediaType: AVMediaTypeVideo)
var defaultDevice: AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video)!
var frontDevice: AVCaptureDevice? = {
if #available(iOS 10, *) {
return AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front)
return AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: .front)
}
else {
for device in AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) {
if let _device = device as? AVCaptureDevice , _device.position == AVCaptureDevicePosition.front {
return _device
for device in AVCaptureDevice.devices(for: AVMediaType.video) {
if device.position == AVCaptureDevice.Position.front {
return device
}
}
}
@ -67,8 +67,8 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
return AVCaptureVideoPreviewLayer(session: self.session)
}()
/// An array of strings identifying the types of metadata objects to process.
public let metadataObjectTypes: [String]
/// An array of object identifying the types of metadata objects to process.
public let metadataObjectTypes: [AVMetadataObject.ObjectType]
// MARK: - Managing the Code Discovery
@ -79,7 +79,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
public var didFindCode: ((QRCodeReaderResult) -> Void)?
/// Block is executed when a found metadata object string could not be decoded.
public var didFailDecoding: ((Void) -> Void)?
public var didFailDecoding: (() -> Void)?
// MARK: - Creating the Code Reade
@ -87,15 +87,15 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
Initializes the code reader with the QRCode metadata type object.
*/
public convenience override init() {
self.init(metadataObjectTypes: [AVMetadataObjectTypeQRCode], captureDevicePosition: .back)
self.init(metadataObjectTypes: [AVMetadataObject.ObjectType.qr], captureDevicePosition: .back)
}
/**
Initializes the code reader with an array of metadata object types, and the default initial capture position
- parameter metadataObjectTypes: An array of strings identifying the types of metadata objects to process.
- parameter metadataObjectTypes: An array of objects identifying the types of metadata objects to process.
*/
public convenience init(metadataObjectTypes types: [String]) {
public convenience init(metadataObjectTypes types: [AVMetadataObject.ObjectType]) {
self.init(metadataObjectTypes: types, captureDevicePosition: .back)
}
@ -104,17 +104,17 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
- parameter captureDevicePosition: The capture position to use on start of scanning
*/
public convenience init(captureDevicePosition position: AVCaptureDevicePosition) {
self.init(metadataObjectTypes: [AVMetadataObjectTypeQRCode], captureDevicePosition: position)
public convenience init(captureDevicePosition position: AVCaptureDevice.Position) {
self.init(metadataObjectTypes: [AVMetadataObject.ObjectType.qr], captureDevicePosition: position)
}
/**
Initializes the code reader with an array of metadata object types.
- parameter metadataObjectTypes: An array of strings identifying the types of metadata objects to process.
- parameter metadataObjectTypes: An array of objects identifying the types of metadata objects to process.
- parameter captureDevicePosition: The Camera to use on start of scanning.
*/
public init(metadataObjectTypes types: [String], captureDevicePosition: AVCaptureDevicePosition) {
public init(metadataObjectTypes types: [AVMetadataObject.ObjectType], captureDevicePosition: AVCaptureDevice.Position) {
metadataObjectTypes = types
super.init()
@ -124,7 +124,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
// MARK: - Initializing the AV Components
private func configureDefaultComponents(withCaptureDevicePosition: AVCaptureDevicePosition) {
private func configureDefaultComponents(withCaptureDevicePosition: AVCaptureDevice.Position) {
session.addOutput(metadataOutput)
switch withCaptureDevicePosition {
@ -141,7 +141,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
metadataOutput.metadataObjectTypes = metadataObjectTypes
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
/// Switch between the back and the front camera.
@ -154,7 +154,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
session.removeInput(_currentInput)
let newDeviceInput = (_currentInput.device.position == .front) ? defaultDeviceInput : _frontDeviceInput
session.addInput(newDeviceInput)
session.addInput(newDeviceInput!)
}
session.commitConfiguration()
@ -219,7 +219,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
try defaultDevice.lockForConfiguration()
let current = defaultDevice.torchMode
defaultDevice.torchMode = AVCaptureTorchMode.on == current ? .off : .on
defaultDevice.torchMode = AVCaptureDevice.TorchMode.on == current ? .off : .on
defaultDevice.unlockForConfiguration()
}
@ -294,22 +294,22 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
- returns: A boolean value that indicates whether the reader is available.
*/
public class func isAvailable() -> Bool {
let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
return (try? AVCaptureDeviceInput(device: captureDevice)) != nil
return (try? AVCaptureDeviceInput(device: captureDevice!)) != nil
}
/**
Checks and return whether the given metadata object types are supported by the current device.
- parameter metadataTypes: An array of strings identifying the types of metadata objects to check.
- parameter metadataTypes: An array of objects identifying the types of metadata objects to check.
- returns: A boolean value that indicates whether the device supports the given metadata object types.
*/
public class func supportsMetadataObjectTypes(_ metadataTypes: [String]? = nil) throws -> Bool {
let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
public class func supportsMetadataObjectTypes(_ metadataTypes: [AVMetadataObject.ObjectType]? = nil) throws -> Bool {
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
let deviceInput = try AVCaptureDeviceInput(device: captureDevice)
let deviceInput = try AVCaptureDeviceInput(device: captureDevice!)
let output = AVCaptureMetadataOutput()
let session = AVCaptureSession()
@ -321,11 +321,11 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
if metadataObjectTypes == nil || metadataObjectTypes?.count == 0 {
// Check the QRCode metadata object type by default
metadataObjectTypes = [AVMetadataObjectTypeQRCode]
metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
}
for metadataObjectType in metadataObjectTypes! {
if !output.availableMetadataObjectTypes.contains(where: { $0 as! String == metadataObjectType }) {
if !output.availableMetadataObjectTypes.contains(where: { $0 == metadataObjectType }) {
return false
}
}
@ -335,7 +335,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods
public func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
public func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
for current in metadataObjects {
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
if _readableCodeObject.stringValue != nil {
@ -345,7 +345,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
stopScanning()
}
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type)
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type.rawValue)
DispatchQueue.main.async(execute: { [weak self] in
self?.didFindCode?(scannedResult)

View File

@ -144,7 +144,7 @@ final public class QRCodeReaderView: UIView, QRCodeReaderDisplayable {
}
}
func orientationDidChange() {
@objc func orientationDidChange() {
setNeedsDisplay()
overlayView?.setNeedsDisplay()

View File

@ -167,7 +167,7 @@ public class QRCodeReaderViewController: UIViewController {
// MARK: - Catching Button Events
func cancelAction(_ button: UIButton) {
@objc func cancelAction(_ button: UIButton) {
codeReader.stopScanning()
if let _completionBlock = completionBlock {
@ -177,13 +177,13 @@ public class QRCodeReaderViewController: UIViewController {
delegate?.readerDidCancel(self)
}
func switchCameraAction(_ button: SwitchCameraButton) {
@objc func switchCameraAction(_ button: SwitchCameraButton) {
if let newDevice = codeReader.switchDeviceInput() {
delegate?.reader(self, didSwitchCamera: newDevice)
}
}
func toggleTorchAction(_ button: ToggleTorchButton) {
@objc func toggleTorchAction(_ button: ToggleTorchButton) {
codeReader.toggleTorch()
}
}