From f7b0db3886f880af32e9f930c934e13f332617fa Mon Sep 17 00:00:00 2001 From: Dmitry Kuleshov Date: Sun, 14 Oct 2018 23:45:40 +0300 Subject: [PATCH] Swift 4.2 update --- SweetAlert.xcodeproj/project.pbxproj | 26 +++++- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ SweetAlert/AppDelegate.swift | 2 +- SweetAlert/SweetAlert.swift | 79 +++++++++++-------- SweetAlert/ViewController.swift | 3 +- 5 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 SweetAlert.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/SweetAlert.xcodeproj/project.pbxproj b/SweetAlert.xcodeproj/project.pbxproj index 1315d9a..85a440b 100644 --- a/SweetAlert.xcodeproj/project.pbxproj +++ b/SweetAlert.xcodeproj/project.pbxproj @@ -134,12 +134,12 @@ 9B4CD1001A06E55200B65DE0 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = "Sahil Wasan"; TargetAttributes = { 9B4CD1071A06E55200B65DE0 = { CreatedOnToolsVersion = 6.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1000; }; }; }; @@ -219,14 +219,22 @@ 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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; @@ -265,14 +273,22 @@ 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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; @@ -304,7 +320,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "GNDBL.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -316,7 +333,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "GNDBL.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.2; }; name = Release; }; diff --git a/SweetAlert.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SweetAlert.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SweetAlert.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SweetAlert/AppDelegate.swift b/SweetAlert/AppDelegate.swift index b005a4f..5414a37 100644 --- a/SweetAlert/AppDelegate.swift +++ b/SweetAlert/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/SweetAlert/SweetAlert.swift b/SweetAlert/SweetAlert.swift index 6c7b30a..2efd963 100644 --- a/SweetAlert/SweetAlert.swift +++ b/SweetAlert/SweetAlert.swift @@ -39,7 +39,7 @@ open class SweetAlert: UIViewController { init() { super.init(nibName: nil, bundle: nil) self.view.frame = UIScreen.main.bounds - self.view.autoresizingMask = [UIViewAutoresizing.flexibleHeight, UIViewAutoresizing.flexibleWidth] + self.view.autoresizingMask = [UIView.AutoresizingMask.flexibleHeight, UIView.AutoresizingMask.flexibleWidth] self.view.backgroundColor = UIColor(red:0, green:0, blue:0, alpha:kBakcgroundTansperancy) self.view.addSubview(contentView) @@ -108,7 +108,7 @@ open class SweetAlert: UIViewController { // Subtitle if self.subTitleTextView.text.isEmpty == false { let subtitleString = subTitleTextView.text! as NSString - let rect = subtitleString.boundingRect(with: CGSize(width: width, height: 0.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName:subTitleTextView.font!], context: nil) + let rect = subtitleString.boundingRect(with: CGSize(width: width, height: 0.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.font):subTitleTextView.font!]), context: nil) textViewHeight = ceil(rect.size.height) + 10.0 subTitleTextView.frame = CGRect(x: x, y: y, width: width, height: textViewHeight) contentView.addSubview(subTitleTextView) @@ -117,8 +117,8 @@ open class SweetAlert: UIViewController { var buttonRect:[CGRect] = [] for button in buttons { - let string = button.title(for: UIControlState())! as NSString - buttonRect.append(string.boundingRect(with: CGSize(width: width, height:0.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes:[NSFontAttributeName:button.titleLabel!.font], context:nil)) + let string = button.title(for: UIControl.State())! as NSString + buttonRect.append(string.boundingRect(with: CGSize(width: width, height:0.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes:convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.font):button.titleLabel!.font]), context:nil)) } var totalWidth: CGFloat = 0.0 @@ -136,7 +136,7 @@ open class SweetAlert: UIViewController { buttonX = buttons[i].frame.origin.x + kWidthMargin + buttonRect[i].size.width + 20.0 buttons[i].layer.cornerRadius = 5.0 self.contentView.addSubview(buttons[i]) - buttons[i].addTarget(self, action: #selector(SweetAlert.pressed(_:)), for: UIControlEvents.touchUpInside) + buttons[i].addTarget(self, action: #selector(SweetAlert.pressed(_:)), for: UIControl.Event.touchUpInside) } y += kHeightMargin + buttonRect[0].size.height + 10.0 @@ -157,7 +157,7 @@ open class SweetAlert: UIViewController { contentView.clipsToBounds = true } - open func pressed(_ sender: UIButton!) { + @objc open func pressed(_ sender: UIButton!) { self.closeAlert(sender.tag) } @@ -168,7 +168,7 @@ open class SweetAlert: UIViewController { let ver = sver.floatValue if ver < 8.0 { // iOS versions before 7.0 did not switch the width and height on device roration - if UIInterfaceOrientationIsLandscape(UIApplication.shared.statusBarOrientation) { + if UIApplication.shared.statusBarOrientation.isLandscape { let ssz = sz sz = CGSize(width:ssz.height, height:ssz.width) } @@ -184,7 +184,7 @@ open class SweetAlert: UIViewController { SweetAlertContext.shouldNotAnimate = false } - UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: { () -> Void in + UIView.animate(withDuration: 0.5, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: { () -> Void in self.view.alpha = 0.0 }) { (Bool) -> Void in self.view.removeFromSuperview() @@ -242,7 +242,7 @@ open class SweetAlert: UIViewController { userAction = action let window: UIWindow = UIApplication.shared.keyWindow! window.addSubview(view) - window.bringSubview(toFront: view) + window.bringSubviewToFront(view) view.frame = window.bounds self.setupContentView() self.setupTitleLabel() @@ -272,8 +272,8 @@ open class SweetAlert: UIViewController { } buttons = [] if buttonTitle.isEmpty == false { - let button: UIButton = UIButton(type: UIButtonType.custom) - button.setTitle(buttonTitle, for: UIControlState()) + let button: UIButton = UIButton(type: UIButton.ButtonType.custom) + button.setTitle(buttonTitle, for: UIControl.State()) button.backgroundColor = buttonColor button.isUserInteractionEnabled = true button.tag = 0 @@ -281,10 +281,10 @@ open class SweetAlert: UIViewController { } if otherButtonTitle != nil && otherButtonTitle!.isEmpty == false { - let button: UIButton = UIButton(type: UIButtonType.custom) - button.setTitle(otherButtonTitle, for: UIControlState()) + let button: UIButton = UIButton(type: UIButton.ButtonType.custom) + button.setTitle(otherButtonTitle, for: UIControl.State()) button.backgroundColor = otherButtonColor - button.addTarget(self, action: #selector(SweetAlert.pressed(_:)), for: UIControlEvents.touchUpInside) + button.addTarget(self, action: #selector(SweetAlert.pressed(_:)), for: UIControl.Event.touchUpInside) button.tag = 1 buttons.append(button) } @@ -355,7 +355,7 @@ class CancelAnimatedView: AnimatableView { setupLayers() var t = CATransform3DIdentity; t.m34 = 1.0 / -500.0; - t = CATransform3DRotate(t, CGFloat(90.0 * M_PI / 180.0), 1, 0, 0); + t = CATransform3DRotate(t, CGFloat(90.0 * .pi / 180.0), 1, 0, 0); circleLayer.transform = t crossPathLayer.opacity = 0.0 } @@ -370,8 +370,8 @@ class CancelAnimatedView: AnimatableView { fileprivate var outlineCircle: CGPath { let path = UIBezierPath() - let startAngle: CGFloat = CGFloat((0) / 180.0 * M_PI) //0 - let endAngle: CGFloat = CGFloat((360) / 180.0 * M_PI) //360 + let startAngle: CGFloat = CGFloat((0) / 180.0 * .pi) //0 + let endAngle: CGFloat = CGFloat((360) / 180.0 * .pi) //360 path.addArc(withCenter: CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.width/2.0), radius: self.frame.size.width/2.0, startAngle: startAngle, endAngle: endAngle, clockwise: false) return path.cgPath @@ -392,7 +392,7 @@ class CancelAnimatedView: AnimatableView { circleLayer.path = outlineCircle circleLayer.fillColor = UIColor.clear.cgColor; circleLayer.strokeColor = UIColor.colorFromRGB(0xF27474).cgColor; - circleLayer.lineCap = kCALineCapRound + circleLayer.lineCap = CAShapeLayerLineCap.round circleLayer.lineWidth = 4; circleLayer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) circleLayer.position = CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.height/2.0) @@ -401,7 +401,7 @@ class CancelAnimatedView: AnimatableView { crossPathLayer.path = crossPath crossPathLayer.fillColor = UIColor.clear.cgColor; crossPathLayer.strokeColor = UIColor.colorFromRGB(0xF27474).cgColor; - crossPathLayer.lineCap = kCALineCapRound + crossPathLayer.lineCap = CAShapeLayerLineCap.round crossPathLayer.lineWidth = 4; crossPathLayer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) crossPathLayer.position = CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.height/2.0) @@ -412,11 +412,11 @@ class CancelAnimatedView: AnimatableView { override func animate() { var t = CATransform3DIdentity; t.m34 = 1.0 / -500.0; - t = CATransform3DRotate(t, CGFloat(90.0 * M_PI / 180.0), 1, 0, 0); + t = CATransform3DRotate(t, CGFloat(90.0 * .pi / 180.0), 1, 0, 0); var t2 = CATransform3DIdentity; t2.m34 = 1.0 / -500.0; - t2 = CATransform3DRotate(t2, CGFloat(-M_PI), 1, 0, 0); + t2 = CATransform3DRotate(t2, CGFloat( Double.pi * -1), 1, 0, 0); let animation = CABasicAnimation(keyPath: "transform") let time = 0.3 @@ -424,7 +424,7 @@ class CancelAnimatedView: AnimatableView { animation.fromValue = NSValue(caTransform3D: t) animation.toValue = NSValue(caTransform3D:t2) animation.isRemovedOnCompletion = false - animation.fillMode = kCAFillModeForwards + animation.fillMode = CAMediaTimingFillMode.forwards self.circleLayer.add(animation, forKey: "transform") @@ -446,7 +446,7 @@ class CancelAnimatedView: AnimatableView { fadeInAnimation.fromValue = 0.3 fadeInAnimation.toValue = 1.0 fadeInAnimation.isRemovedOnCompletion = false - fadeInAnimation.fillMode = kCAFillModeForwards + fadeInAnimation.fillMode = CAMediaTimingFillMode.forwards self.crossPathLayer.add(fadeInAnimation, forKey: "opacity") } @@ -472,8 +472,8 @@ class InfoAnimatedView: AnimatableView { var outlineCircle: CGPath { let path = UIBezierPath() - let startAngle: CGFloat = CGFloat((0) / 180.0 * M_PI) //0 - let endAngle: CGFloat = CGFloat((360) / 180.0 * M_PI) //360 + let startAngle: CGFloat = CGFloat((0) / 180.0 * .pi) //0 + let endAngle: CGFloat = CGFloat((360) / 180.0 * .pi) //360 path.addArc(withCenter: CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.width/2.0), radius: self.frame.size.width/2.0, startAngle: startAngle, endAngle: endAngle, clockwise: false) let factor:CGFloat = self.frame.size.width / 1.5 @@ -489,7 +489,7 @@ class InfoAnimatedView: AnimatableView { circleLayer.path = outlineCircle circleLayer.fillColor = UIColor.clear.cgColor; circleLayer.strokeColor = UIColor.colorFromRGB(0xF8D486).cgColor; - circleLayer.lineCap = kCALineCapRound + circleLayer.lineCap = CAShapeLayerLineCap.round circleLayer.lineWidth = 4; circleLayer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) circleLayer.position = CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.height/2.0) @@ -501,7 +501,7 @@ class InfoAnimatedView: AnimatableView { let colorAnimation = CABasicAnimation(keyPath:"strokeColor") colorAnimation.duration = 1.0; colorAnimation.repeatCount = HUGE - colorAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + colorAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) colorAnimation.autoreverses = true colorAnimation.fromValue = UIColor.colorFromRGB(0xF7D58B).cgColor colorAnimation.toValue = UIColor.colorFromRGB(0xF2A665).cgColor @@ -533,16 +533,16 @@ class SuccessAnimatedView: AnimatableView { var outlineCircle: CGPath { let path = UIBezierPath() - let startAngle: CGFloat = CGFloat((0) / 180.0 * M_PI) //0 - let endAngle: CGFloat = CGFloat((360) / 180.0 * M_PI) //360 + let startAngle: CGFloat = CGFloat((0) / 180.0 * .pi) //0 + let endAngle: CGFloat = CGFloat((360) / 180.0 * .pi) //360 path.addArc(withCenter: CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.height/2.0), radius: self.frame.size.width/2.0, startAngle: startAngle, endAngle: endAngle, clockwise: false) return path.cgPath } var path: CGPath { let path = UIBezierPath() - let startAngle:CGFloat = CGFloat((60) / 180.0 * M_PI) //60 - let endAngle:CGFloat = CGFloat((200) / 180.0 * M_PI) //190 + let startAngle:CGFloat = CGFloat((60) / 180.0 * .pi) //60 + let endAngle:CGFloat = CGFloat((200) / 180.0 * .pi) //190 path.addArc(withCenter: CGPoint(x: self.frame.size.width/2.0, y: self.frame.size.height/2.0), radius: self.frame.size.width/2.0, startAngle: startAngle, endAngle: endAngle, clockwise: false) path.addLine(to: CGPoint(x: 36.0 - 10.0 ,y: 60.0 - 10.0)) path.addLine(to: CGPoint(x: 85.0 - 20.0, y: 30.0 - 20.0)) @@ -557,7 +557,7 @@ class SuccessAnimatedView: AnimatableView { outlineLayer.path = outlineCircle outlineLayer.fillColor = UIColor.clear.cgColor; outlineLayer.strokeColor = UIColor(red: 150.0/255.0, green: 216.0/255.0, blue: 115.0/255.0, alpha: 1.0).cgColor; - outlineLayer.lineCap = kCALineCapRound + outlineLayer.lineCap = CAShapeLayerLineCap.round outlineLayer.lineWidth = 4; outlineLayer.opacity = 0.1 self.layer.addSublayer(outlineLayer) @@ -567,7 +567,7 @@ class SuccessAnimatedView: AnimatableView { circleLayer.path = path circleLayer.fillColor = UIColor.clear.cgColor; circleLayer.strokeColor = UIColor(red: 150.0/255.0, green: 216.0/255.0, blue: 115.0/255.0, alpha: 1.0).cgColor; - circleLayer.lineCap = kCALineCapRound + circleLayer.lineCap = CAShapeLayerLineCap.round circleLayer.lineWidth = 4; circleLayer.actions = [ "strokeStart": NSNull(), @@ -591,7 +591,7 @@ class SuccessAnimatedView: AnimatableView { strokeStart.toValue = 0.68 strokeStart.duration = 7.0*factor strokeStart.beginTime = CACurrentMediaTime() + 3.0*factor - strokeStart.fillMode = kCAFillModeBackwards + strokeStart.fillMode = CAMediaTimingFillMode.backwards strokeStart.timingFunction = timing circleLayer.strokeStart = 0.68 circleLayer.strokeEnd = 0.93 @@ -612,3 +612,14 @@ extension UIColor { } } + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? { + guard let input = input else { return nil } + return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value)}) +} + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String { + return input.rawValue +} diff --git a/SweetAlert/ViewController.swift b/SweetAlert/ViewController.swift index ab5ada2..a1c0142 100644 --- a/SweetAlert/ViewController.swift +++ b/SweetAlert/ViewController.swift @@ -68,7 +68,8 @@ class ViewController: UIViewController { } @IBAction func customIconAlert(_ sender: AnyObject) { - _ = SweetAlert().showAlert("Sweet!", subTitle: "Here's a custom image.", style: AlertStyle.customImag(imageFile: "thumb.jpg")) + _ = SweetAlert().showAlert("Sweet!", subTitle: "Here's a custom image.", + style: AlertStyle.customImage(imageFile: "thumb.jpg")) } }