From 093ef053183d58ad8b6a2e9f6f5a2c4b98059a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20C=C5=93ur?= Date: Fri, 21 Apr 2017 21:15:41 +0800 Subject: [PATCH 1/2] migration to Swift3 --- JSONSerializerSwift.xcodeproj/project.pbxproj | 17 ++- .../xcschemes/JSONGenSwift(OSX).xcscheme | 2 +- .../xcschemes/JSONSerializerSwift.xcscheme | 2 +- JSONSerializerSwift/JSONReader.swift | 76 ++++++------- JSONSerializerSwift/JSONWriter.swift | 46 ++++---- JSONSerializerSwift/Reader.swift | 14 +-- JSONSerializerSwift/Writer.swift | 26 ++--- .../JSONSerializerSwiftTests.swift | 2 +- JSONSerializerSwiftTests/Test.swift | 102 +++++++++--------- 9 files changed, 151 insertions(+), 136 deletions(-) diff --git a/JSONSerializerSwift.xcodeproj/project.pbxproj b/JSONSerializerSwift.xcodeproj/project.pbxproj index 2ea55be..530a47e 100644 --- a/JSONSerializerSwift.xcodeproj/project.pbxproj +++ b/JSONSerializerSwift.xcodeproj/project.pbxproj @@ -314,14 +314,16 @@ attributes = { LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = TonicDesign; TargetAttributes = { BC17DD871B04E609003F3DD4 = { CreatedOnToolsVersion = 6.2; + LastSwiftMigration = 0830; }; BC17DD921B04E609003F3DD4 = { CreatedOnToolsVersion = 6.2; + LastSwiftMigration = 0830; }; BC9DD4851B176D0300BB199C = { CreatedOnToolsVersion = 6.3.2; @@ -453,8 +455,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"; @@ -464,6 +468,7 @@ ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -500,8 +505,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"; @@ -510,6 +517,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -519,6 +527,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -530,6 +539,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -541,6 +551,7 @@ PRODUCT_NAME = JSONSerializerSwift; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -548,6 +559,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -558,6 +570,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.tonicdesign.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = JSONSerializerSwift; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -573,6 +586,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.tonicdesign.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = JSONSerializerSwiftTests; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -584,6 +598,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.tonicdesign.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = JSONSerializerSwiftTests; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/JSONSerializerSwift.xcodeproj/xcshareddata/xcschemes/JSONGenSwift(OSX).xcscheme b/JSONSerializerSwift.xcodeproj/xcshareddata/xcschemes/JSONGenSwift(OSX).xcscheme index 1fe5ea2..2ad06f0 100644 --- a/JSONSerializerSwift.xcodeproj/xcshareddata/xcschemes/JSONGenSwift(OSX).xcscheme +++ b/JSONSerializerSwift.xcodeproj/xcshareddata/xcschemes/JSONGenSwift(OSX).xcscheme @@ -1,6 +1,6 @@ Reader? { - var readData : AnyObject? + open class func from(_ data: Data) -> Reader? { + var readData : Any? do { - readData = try NSJSONSerialization.JSONObjectWithData(data, options: []) + readData = try JSONSerialization.jsonObject(with: data, options: []) } catch { print(error) } @@ -30,22 +30,22 @@ public class JSONReader : Reader { } } - public class func from(inputStream: NSInputStream) -> Reader? { - let dict: NSDictionary = (try! NSJSONSerialization.JSONObjectWithStream(inputStream, options: [])) as! NSDictionary + open class func from(_ inputStream: InputStream) -> Reader? { + let dict: NSDictionary = (try! JSONSerialization.jsonObject(with: inputStream, options: [])) as! NSDictionary return JSONReader(dictionary: dict) } - public func readTag() -> Int { - if let value: AnyObject = repeatedObject?.generator.next() { + open func readTag() -> Int { + if let value: Any = repeatedObject?.generator.next() { object = value return repeatedObject!.key } if let keyValuePair = generator.next(), - info = tagMap[keyValuePair.key as! String] { + let info = tagMap[keyValuePair.key as! String] { if info.1 { - repeatedObject = (key: info.0, generator: (keyValuePair.value as! NSArray).generate()) + repeatedObject = (key: info.0, generator: (keyValuePair.value as! NSArray).makeIterator()) object = repeatedObject?.generator.next() } else { object = keyValuePair.value @@ -61,98 +61,98 @@ public class JSONReader : Reader { } } - public func readVarInt() -> Int { - if let v = (object as? NSNumber)?.integerValue { + open func readVarInt() -> Int { + if let v = (object as? NSNumber)?.intValue { return v } return 0 } - public func readVarUInt() -> UInt { - if let v = (object as? NSNumber)?.unsignedIntegerValue { + open func readVarUInt() -> UInt { + if let v = (object as? NSNumber)?.uintValue { return UInt(v) } return 0 } - public func readVarUInt64() -> UInt64 { - if let v = (object as? NSNumber)?.unsignedLongLongValue { + open func readVarUInt64() -> UInt64 { + if let v = (object as? NSNumber)?.uint64Value { return UInt64(v) } return 0 } - public func readBool() -> Bool { + open func readBool() -> Bool { if let v = (object as? NSNumber)?.boolValue { return v } return false } - public func readData() -> NSData { - NSException(name:"Unsupported Operation", reason:"", userInfo: nil).raise() - return NSData() + open func readData() -> Data { + NSException(name: NSExceptionName(rawValue: "Unsupported Operation"), reason: "", userInfo: nil).raise() + return Data() } - public func readUInt32() -> UInt32 { - if let v = (object as? NSNumber)?.unsignedIntegerValue { + open func readUInt32() -> UInt32 { + if let v = (object as? NSNumber)?.uintValue { return UInt32(v) } return 0 } - public func readUInt64() -> UInt64 { - if let v = (object as? NSNumber)?.unsignedIntegerValue { + open func readUInt64() -> UInt64 { + if let v = (object as? NSNumber)?.uintValue { return UInt64(v) } return 0 } - public func readFloat32() -> Float32 { + open func readFloat32() -> Float32 { if let v = (object as? NSNumber)?.floatValue { return Float32(v) } return 0 } - public func readFloat64() -> Float64 { + open func readFloat64() -> Float64 { if let v = (object as? NSNumber)?.doubleValue { return Float64(v) } return 0 } - public func readString() -> String { + open func readString() -> String { if let value = object as? String { return value } return "" } - public func pushLimit(limit: Int) -> Int { + open func pushLimit(_ limit: Int) -> Int { return 0 // NO OP } - public func popLimit(limit: Int) { + open func popLimit(_ limit: Int) { // NO OP } - public func pushTagMap(map: [String:(Int, Bool)]) { + open func pushTagMap(_ map: [String:(Int, Bool)]) { if nil != self.tagMap { tagMapStack.append(self.tagMap) generatorStack.append(generator) - generator = (object as! NSDictionary).generate() + generator = (object as! NSDictionary).makeIterator() repeatedObjectStack.append(repeatedObject) repeatedObject = nil } self.tagMap = map } - public func popTagMap() { + open func popTagMap() { if tagMapStack.count > 0 { tagMap = tagMapStack.removeLast() generator = generatorStack.removeLast() repeatedObject = repeatedObjectStack.removeLast() } } -} \ No newline at end of file +} diff --git a/JSONSerializerSwift/JSONWriter.swift b/JSONSerializerSwift/JSONWriter.swift index eb8f4df..f249a62 100644 --- a/JSONSerializerSwift/JSONWriter.swift +++ b/JSONSerializerSwift/JSONWriter.swift @@ -1,6 +1,6 @@ import Foundation -public class JSONWriter : Writer { +open class JSONWriter : Writer { var tagMapStack: [[Int:(String, Bool)]] = [] var tagMap: [Int:(String, Bool)]! = nil var objectStack: [NSMutableDictionary] = [] @@ -8,65 +8,65 @@ public class JSONWriter : Writer { var tag: Int! = nil var isRepeatedStack: [Bool] = [] - public class func writer() -> Writer? { + open class func writer() -> Writer? { return JSONWriter() } - public func toBuffer() -> NSData { - return try! NSJSONSerialization.dataWithJSONObject(object, options: []) + open func toBuffer() -> Data { + return try! JSONSerialization.data(withJSONObject: object, options: []) } - public func writeTag(tag: Int) { + open func writeTag(_ tag: Int) { self.tag = tag } - public func writeByte(v: UInt8) { + open func writeByte(_ v: UInt8) { self.writeValue(Int(v)) } - public func writeVarInt(v: Int) { + open func writeVarInt(_ v: Int) { if 0 == tag & 0x02 { self.writeValue(v) } } - public func writeVarUInt(v: UInt) { + open func writeVarUInt(_ v: UInt) { self.writeValue(v) } - public func writeVarUInt64(v: UInt64) { + open func writeVarUInt64(_ v: UInt64) { self.writeValue(Int(v)) } - public func writeBool(v: Bool) { + open func writeBool(_ v: Bool) { self.writeValue(v) } - public func writeData(v: NSData) { - NSException(name:"Unsupported Operation", reason:"", userInfo: nil).raise() + open func writeData(_ v: Data) { + NSException(name: NSExceptionName(rawValue: "Unsupported Operation"), reason: "", userInfo: nil).raise() } - public func writeFloat32(v: Float32) { + open func writeFloat32(_ v: Float32) { self.writeValue(v) } - public func writeFloat64(v: Float64) { + open func writeFloat64(_ v: Float64) { self.writeValue(v) } - public func writeString(v: String) { + open func writeString(_ v: String) { self.writeValue(v) } - private func writeValue(v: AnyObject) { + fileprivate func writeValue(_ v: Any) { self.writeValue(v, object: object) } - private func writeValue(v: AnyObject, object: NSMutableDictionary) { + fileprivate func writeValue(_ v: Any, object: NSMutableDictionary) { if let info = tagMap[tag] { if info.1 { if let array = object[info.0] as? NSMutableArray { - array.addObject(v) + array.add(v) } else { object[info.0] = NSMutableArray(objects: v) } @@ -78,21 +78,21 @@ public class JSONWriter : Writer { } } - public func pushTagMap(map: [Int:(String, Bool)]) { + open func pushTagMap(_ map: [Int:(String, Bool)]) { let parentObject = object object = [:] if tag != nil { - self.writeValue(object, object: parentObject) + self.writeValue(object, object: parentObject!) } - if nil != tagMap { + if tagMap != nil { tagMapStack.append(tagMap) - objectStack.append(parentObject) + objectStack.append(parentObject!) } tagMap = map } - public func popTagMap() { + open func popTagMap() { if tagMapStack.count > 0 { tagMap = tagMapStack.removeLast() object = objectStack.removeLast() diff --git a/JSONSerializerSwift/Reader.swift b/JSONSerializerSwift/Reader.swift index 81811d8..2a33a4c 100644 --- a/JSONSerializerSwift/Reader.swift +++ b/JSONSerializerSwift/Reader.swift @@ -1,21 +1,21 @@ import Foundation public protocol Reader { - static func from(data: NSData) -> Reader? - static func from(inputStream: NSInputStream) -> Reader? + static func from(_ data: Data) -> Reader? + static func from(_ inputStream: InputStream) -> Reader? func readTag() -> Int func readVarInt() -> Int func readVarUInt() -> UInt func readVarUInt64() -> UInt64 func readBool() -> Bool - func readData() -> NSData + func readData() -> Data func readFloat32() -> Float32 func readFloat64() -> Float64 func readUInt32() -> UInt32 func readUInt64() -> UInt64 func readString() -> String - func pushLimit(limit: Int) -> Int - func popLimit(limit: Int) - func pushTagMap(map: [String:(Int, Bool)]) + func pushLimit(_ limit: Int) -> Int + func popLimit(_ limit: Int) + func pushTagMap(_ map: [String:(Int, Bool)]) func popTagMap() -} \ No newline at end of file +} diff --git a/JSONSerializerSwift/Writer.swift b/JSONSerializerSwift/Writer.swift index 81c81d9..24416eb 100644 --- a/JSONSerializerSwift/Writer.swift +++ b/JSONSerializerSwift/Writer.swift @@ -2,17 +2,17 @@ import Foundation public protocol Writer { static func writer() -> Writer? - func toBuffer() -> NSData - func writeTag(tag: Int) - func writeByte(v: UInt8) - func writeVarInt(v: Int) - func writeVarUInt(v: UInt) - func writeVarUInt64(v: UInt64) - func writeData(v: NSData) - func writeBool(v: Bool) - func writeFloat32(v: Float32) - func writeFloat64(v: Float64) - func writeString(v: String) - func pushTagMap(map: [Int:(String, Bool)]) + func toBuffer() -> Data + func writeTag(_ tag: Int) + func writeByte(_ v: UInt8) + func writeVarInt(_ v: Int) + func writeVarUInt(_ v: UInt) + func writeVarUInt64(_ v: UInt64) + func writeData(_ v: Data) + func writeBool(_ v: Bool) + func writeFloat32(_ v: Float32) + func writeFloat64(_ v: Float64) + func writeString(_ v: String) + func pushTagMap(_ map: [Int:(String, Bool)]) func popTagMap() -} \ No newline at end of file +} diff --git a/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift b/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift index 6502a0f..286137e 100644 --- a/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift +++ b/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift @@ -29,7 +29,7 @@ class JSONSerializerSwiftTests: XCTestCase { let writer = JSONWriter.writer()! demoMessage.toWriter(writer) let buffer = writer.toBuffer() - let jsonString = NSString(data: buffer, encoding: NSUTF8StringEncoding) + let jsonString = NSString(data: buffer, encoding: String.Encoding.utf8.rawValue) assert(jsonString == "{\"demoInt32\":42,\"demoNestedMessage\":{\"nestedString\":\"nested string\",\"nestedInt32\":42},\"demoRepeated\":[\"Hello\",\"World\",\"Foo\",\"Bar\"],\"demoDouble\":5,\"demoString\":\"demo string\",\"demoBool\":true,\"demoRepeatedNestedMessage\":[{\"nestedString\":\"nested string\",\"nestedInt32\":42},{\"nestedString\":\"nested string\",\"nestedInt32\":42}],\"demoInt64\":123}") let reader = JSONReader.from(buffer)! diff --git a/JSONSerializerSwiftTests/Test.swift b/JSONSerializerSwiftTests/Test.swift index 563863f..4b4848e 100644 --- a/JSONSerializerSwiftTests/Test.swift +++ b/JSONSerializerSwiftTests/Test.swift @@ -22,16 +22,16 @@ public func ==(a: DemoMessage.DemoNestedMessage, b: DemoMessage.DemoNestedMessag ) } -public class DemoMessage: Equatable { - public let sizeInBytes: Int - public let demoDouble: Float64? - public let demoInt32: Int? - public let demoInt64: Int? - public let demoBool: Bool? - public let demoString: String? - public let demoNestedMessage: DemoNestedMessage? - public let demoRepeated: [String] - public let demoRepeatedNestedMessage: [DemoNestedMessage]! +open class DemoMessage: Equatable { + open let sizeInBytes: Int + open let demoDouble: Float64? + open let demoInt32: Int? + open let demoInt64: Int? + open let demoBool: Bool? + open let demoString: String? + open let demoNestedMessage: DemoNestedMessage? + open let demoRepeated: [String] + open let demoRepeatedNestedMessage: [DemoNestedMessage]! init(sizeInBytes: Int, demoDouble: Float64?, demoInt32: Int?, demoInt64: Int?, demoBool: Bool?, demoString: String?, demoNestedMessage: DemoNestedMessage?, demoRepeated: [String], demoRepeatedNestedMessage: [DemoNestedMessage]!) { self.sizeInBytes = sizeInBytes @@ -45,7 +45,7 @@ public class DemoMessage: Equatable { self.demoRepeatedNestedMessage = demoRepeatedNestedMessage } - public func toWriter(w: Writer) { + open func toWriter(_ w: Writer) { let tagMap: [Int:(String, Bool)] = [ 9 : ("demoDouble", false), 16 : ("demoInt32", false), @@ -104,7 +104,7 @@ public class DemoMessage: Equatable { w.popTagMap() } - public class func fromReader(r: Reader) -> DemoMessage { + open class func fromReader(_ r: Reader) -> DemoMessage { let tagMap: [String:(Int, Bool)] = [ "demoDouble" : (9, false), "demoInt32" : (16, false), @@ -160,7 +160,7 @@ public class DemoMessage: Equatable { return DemoMessage(sizeInBytes: sizeInBytes, demoDouble: demoDouble, demoInt32: demoInt32, demoInt64: demoInt64, demoBool: demoBool, demoString: demoString, demoNestedMessage: demoNestedMessage, demoRepeated: demoRepeated, demoRepeatedNestedMessage: demoRepeatedNestedMessage) } - class func sizeOf(demoDouble: Float64?, demoInt32: Int?, demoInt64: Int?, demoBool: Bool?, demoString: String?, demoNestedMessage: DemoNestedMessage?, demoRepeated: [String], demoRepeatedNestedMessage: [DemoNestedMessage]!) -> Int { + class func sizeOf(_ demoDouble: Float64?, demoInt32: Int?, demoInt64: Int?, demoBool: Bool?, demoString: String?, demoNestedMessage: DemoNestedMessage?, demoRepeated: [String], demoRepeatedNestedMessage: [DemoNestedMessage]!) -> Int { var n = 0 if let _ = demoDouble { @@ -191,14 +191,14 @@ public class DemoMessage: Equatable { return n } - public class func builder() -> DemoMessageBuilder { + open class func builder() -> DemoMessageBuilder { return DemoMessageBuilder() } - public class DemoNestedMessage: Equatable { - public let sizeInBytes: Int - public let nestedString: String? - public let nestedInt32: Int? + open class DemoNestedMessage: Equatable { + open let sizeInBytes: Int + open let nestedString: String? + open let nestedInt32: Int? init(sizeInBytes: Int, nestedString: String?, nestedInt32: Int?) { self.sizeInBytes = sizeInBytes @@ -206,7 +206,7 @@ public class DemoMessage: Equatable { self.nestedInt32 = nestedInt32 } - public func toWriter(w: Writer) { + open func toWriter(_ w: Writer) { let tagMap: [Int:(String, Bool)] = [ 10 : ("nestedString", false), 16 : ("nestedInt32", false) @@ -227,7 +227,7 @@ public class DemoMessage: Equatable { w.popTagMap() } - public class func fromReader(r: Reader) -> DemoNestedMessage { + open class func fromReader(_ r: Reader) -> DemoNestedMessage { let tagMap: [String:(Int, Bool)] = [ "nestedString" : (10, false), "nestedInt32" : (16, false) @@ -255,7 +255,7 @@ public class DemoMessage: Equatable { return DemoNestedMessage(sizeInBytes: sizeInBytes, nestedString: nestedString, nestedInt32: nestedInt32) } - class func sizeOf(nestedString: String?, nestedInt32: Int?) -> Int { + class func sizeOf(_ nestedString: String?, nestedInt32: Int?) -> Int { var n = 0 if let v = nestedString { @@ -268,43 +268,43 @@ public class DemoMessage: Equatable { return n } - public class func builder() -> DemoNestedMessageBuilder { + open class func builder() -> DemoNestedMessageBuilder { return DemoNestedMessageBuilder() } } - public class DemoNestedMessageBuilder { + open class DemoNestedMessageBuilder { var nestedString: String? = nil var nestedInt32: Int? = nil - public func clear() -> Self { + open func clear() -> Self { self.nestedString = nil self.nestedInt32 = nil return self } - public func setNestedString(v: String?) -> Self { + open func setNestedString(_ v: String?) -> Self { self.nestedString = v return self } - public func clearNestedString() -> Self { + open func clearNestedString() -> Self { self.nestedString = nil return self } - public func setNestedInt32(v: Int?) -> Self { + open func setNestedInt32(_ v: Int?) -> Self { self.nestedInt32 = v return self } - public func clearNestedInt32() -> Self { + open func clearNestedInt32() -> Self { self.nestedInt32 = nil return self } - public func build() -> DemoNestedMessage { + open func build() -> DemoNestedMessage { let sizeInBytes = DemoNestedMessage.sizeOf(nestedString, nestedInt32: nestedInt32) return DemoNestedMessage(sizeInBytes: sizeInBytes, nestedString: nestedString, nestedInt32: nestedInt32) } @@ -313,7 +313,7 @@ public class DemoMessage: Equatable { } -public class DemoMessageBuilder { +open class DemoMessageBuilder { var demoDouble: Float64? = nil var demoInt32: Int? = nil var demoInt64: Int? = nil @@ -323,7 +323,7 @@ public class DemoMessageBuilder { var demoRepeated: [String] = [] var demoRepeatedNestedMessage: [DemoMessage.DemoNestedMessage]! = [] - public func clear() -> Self { + open func clear() -> Self { self.demoDouble = nil self.demoInt32 = nil self.demoInt64 = nil @@ -335,103 +335,103 @@ public class DemoMessageBuilder { return self } - public func setDemoDouble(v: Float64?) -> Self { + open func setDemoDouble(_ v: Float64?) -> Self { self.demoDouble = v return self } - public func clearDemoDouble() -> Self { + open func clearDemoDouble() -> Self { self.demoDouble = nil return self } - public func setDemoInt32(v: Int?) -> Self { + open func setDemoInt32(_ v: Int?) -> Self { self.demoInt32 = v return self } - public func clearDemoInt32() -> Self { + open func clearDemoInt32() -> Self { self.demoInt32 = nil return self } - public func setDemoInt64(v: Int?) -> Self { + open func setDemoInt64(_ v: Int?) -> Self { self.demoInt64 = v return self } - public func clearDemoInt64() -> Self { + open func clearDemoInt64() -> Self { self.demoInt64 = nil return self } - public func setDemoBool(v: Bool?) -> Self { + open func setDemoBool(_ v: Bool?) -> Self { self.demoBool = v return self } - public func clearDemoBool() -> Self { + open func clearDemoBool() -> Self { self.demoBool = nil return self } - public func setDemoString(v: String?) -> Self { + open func setDemoString(_ v: String?) -> Self { self.demoString = v return self } - public func clearDemoString() -> Self { + open func clearDemoString() -> Self { self.demoString = nil return self } - public func setDemoNestedMessage(v: DemoMessage.DemoNestedMessage?) -> Self { + open func setDemoNestedMessage(_ v: DemoMessage.DemoNestedMessage?) -> Self { self.demoNestedMessage = v return self } - public func clearDemoNestedMessage() -> Self { + open func clearDemoNestedMessage() -> Self { self.demoNestedMessage = nil return self } - public func setDemoRepeated(v: [String]) -> Self { + open func setDemoRepeated(_ v: [String]) -> Self { self.demoRepeated = v return self } - public func clearDemoRepeated() -> Self { + open func clearDemoRepeated() -> Self { self.demoRepeated = [] return self } - public func setDemoRepeatedNestedMessage(v: [DemoMessage.DemoNestedMessage]!) -> Self { + open func setDemoRepeatedNestedMessage(_ v: [DemoMessage.DemoNestedMessage]!) -> Self { self.demoRepeatedNestedMessage = v return self } - public func clearDemoRepeatedNestedMessage() -> Self { + open func clearDemoRepeatedNestedMessage() -> Self { self.demoRepeatedNestedMessage = [] return self } - public func build() -> DemoMessage { + open func build() -> DemoMessage { let sizeInBytes = DemoMessage.sizeOf(demoDouble, demoInt32: demoInt32, demoInt64: demoInt64, demoBool: demoBool, demoString: demoString, demoNestedMessage: demoNestedMessage, demoRepeated: demoRepeated, demoRepeatedNestedMessage: demoRepeatedNestedMessage) return DemoMessage(sizeInBytes: sizeInBytes, demoDouble: demoDouble, demoInt32: demoInt32, demoInt64: demoInt64, demoBool: demoBool, demoString: demoString, demoNestedMessage: demoNestedMessage, demoRepeated: demoRepeated, demoRepeatedNestedMessage: demoRepeatedNestedMessage) } } -private func sizeOfVarInt(v: Int) -> Int { +private func sizeOfVarInt(_ v: Int) -> Int { var n = 0 var x = v repeat { x = x >> 7 - n++ + n += 1 } while (x > 0) return n } -private func sizeOfString(s: String) -> Int { +private func sizeOfString(_ s: String) -> Int { let b = s.utf8.count return sizeOfVarInt(b) + b } From 05a71b341289ca21c1c52c4c7a9ac4b448809171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20C=C5=93ur?= Date: Fri, 21 Apr 2017 22:21:55 +0800 Subject: [PATCH 2/2] more swift syntax --- .gitignore | 36 ++++--------------- .../JSONSerializerSwift_OSX_Tests.swift | 2 +- JSONSerializerSwift.xcodeproj/project.pbxproj | 10 ++++-- JSONSerializerSwift/JSONReader.swift | 18 +++++----- .../JSONSerializerSwiftTests.swift | 2 +- JSONSerializerSwiftTests/Test.swift | 22 +++++++++--- 6 files changed, 42 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 429be52..9b7c6f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,17 @@ # Xcode # -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata +xcuserdata/ *.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate +*.xcscmblueprint -# Filesystem +# AppCode # -*.swp -.DS_Store +.idea/ # Carthage # -md5/ Carthage/ -# Protoc +# CocoaPods # -*.pb.* -web-resources/node_modules/ -web-resources/.sass-cache/ -web-resources/bin/index.html -web-resources/bin/css/ -web-resources/bin/images/ -web-resources/bin/js/ -web-resources/*.log - -Tonic-Connect-Dashboard.sublime-workspace +Pods/ diff --git a/JSONSerializerSwift(OSX)Tests/JSONSerializerSwift_OSX_Tests.swift b/JSONSerializerSwift(OSX)Tests/JSONSerializerSwift_OSX_Tests.swift index 05796a4..6745ed8 100644 --- a/JSONSerializerSwift(OSX)Tests/JSONSerializerSwift_OSX_Tests.swift +++ b/JSONSerializerSwift(OSX)Tests/JSONSerializerSwift_OSX_Tests.swift @@ -28,7 +28,7 @@ class JSONSerializerSwift_OSX_Tests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measure() { // Put the code you want to measure the time of here. } } diff --git a/JSONSerializerSwift.xcodeproj/project.pbxproj b/JSONSerializerSwift.xcodeproj/project.pbxproj index 530a47e..0bc4992 100644 --- a/JSONSerializerSwift.xcodeproj/project.pbxproj +++ b/JSONSerializerSwift.xcodeproj/project.pbxproj @@ -327,9 +327,11 @@ }; BC9DD4851B176D0300BB199C = { CreatedOnToolsVersion = 6.3.2; + LastSwiftMigration = 0830; }; BC9DD48F1B176D0300BB199C = { CreatedOnToolsVersion = 6.3.2; + LastSwiftMigration = 0830; }; }; }; @@ -459,7 +461,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -509,7 +511,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -625,6 +627,7 @@ PRODUCT_NAME = JSONSerializerSwift; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -647,6 +650,7 @@ PRODUCT_NAME = JSONSerializerSwift; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -670,6 +674,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.tonicdesign.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = JSONSerializerSwiftTests; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -689,6 +694,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.tonicdesign.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = JSONSerializerSwiftTests; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/JSONSerializerSwift/JSONReader.swift b/JSONSerializerSwift/JSONReader.swift index 95dae75..e61be97 100644 --- a/JSONSerializerSwift/JSONReader.swift +++ b/JSONSerializerSwift/JSONReader.swift @@ -1,17 +1,17 @@ import Foundation open class JSONReader : Reader { - typealias RepeatedObject = (key: Int, generator: NSArray.Iterator) + typealias RepeatedObject = (key: Int, generator: Array.Iterator) - var generatorStack: [NSDictionary.Iterator] = [] - var generator: NSDictionary.Iterator + var generatorStack: [Dictionary.Iterator] = [] + var generator: Dictionary.Iterator var tagMapStack: [[String:(Int, Bool)]] = [] var tagMap: [String:(Int, Bool)]! = nil var object: Any! = nil var repeatedObjectStack: [RepeatedObject?] = [] var repeatedObject: RepeatedObject? = nil - init(dictionary: NSDictionary) { + init(dictionary: [String:Any]) { self.generator = dictionary.makeIterator() } @@ -23,7 +23,7 @@ open class JSONReader : Reader { print(error) } - if let dict = readData as? NSDictionary { + if let dict = readData as? [String:Any] { return JSONReader(dictionary: dict) } else { return nil @@ -31,7 +31,7 @@ open class JSONReader : Reader { } open class func from(_ inputStream: InputStream) -> Reader? { - let dict: NSDictionary = (try! JSONSerialization.jsonObject(with: inputStream, options: [])) as! NSDictionary + let dict: [String:Any] = (try! JSONSerialization.jsonObject(with: inputStream, options: [])) as! [String:Any] return JSONReader(dictionary: dict) } @@ -43,9 +43,9 @@ open class JSONReader : Reader { if let keyValuePair = generator.next(), - let info = tagMap[keyValuePair.key as! String] { + let info = tagMap[keyValuePair.key] { if info.1 { - repeatedObject = (key: info.0, generator: (keyValuePair.value as! NSArray).makeIterator()) + repeatedObject = (key: info.0, generator: (keyValuePair.value as! [Any]).makeIterator()) object = repeatedObject?.generator.next() } else { object = keyValuePair.value @@ -141,7 +141,7 @@ open class JSONReader : Reader { if nil != self.tagMap { tagMapStack.append(self.tagMap) generatorStack.append(generator) - generator = (object as! NSDictionary).makeIterator() + generator = (object as! [String:Any]).makeIterator() repeatedObjectStack.append(repeatedObject) repeatedObject = nil } diff --git a/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift b/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift index 286137e..4486220 100644 --- a/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift +++ b/JSONSerializerSwiftTests/JSONSerializerSwiftTests.swift @@ -29,7 +29,7 @@ class JSONSerializerSwiftTests: XCTestCase { let writer = JSONWriter.writer()! demoMessage.toWriter(writer) let buffer = writer.toBuffer() - let jsonString = NSString(data: buffer, encoding: String.Encoding.utf8.rawValue) + let jsonString = String(data: buffer, encoding: .utf8) assert(jsonString == "{\"demoInt32\":42,\"demoNestedMessage\":{\"nestedString\":\"nested string\",\"nestedInt32\":42},\"demoRepeated\":[\"Hello\",\"World\",\"Foo\",\"Bar\"],\"demoDouble\":5,\"demoString\":\"demo string\",\"demoBool\":true,\"demoRepeatedNestedMessage\":[{\"nestedString\":\"nested string\",\"nestedInt32\":42},{\"nestedString\":\"nested string\",\"nestedInt32\":42}],\"demoInt64\":123}") let reader = JSONReader.from(buffer)! diff --git a/JSONSerializerSwiftTests/Test.swift b/JSONSerializerSwiftTests/Test.swift index 4b4848e..d9bf37d 100644 --- a/JSONSerializerSwiftTests/Test.swift +++ b/JSONSerializerSwiftTests/Test.swift @@ -33,7 +33,15 @@ open class DemoMessage: Equatable { open let demoRepeated: [String] open let demoRepeatedNestedMessage: [DemoNestedMessage]! - init(sizeInBytes: Int, demoDouble: Float64?, demoInt32: Int?, demoInt64: Int?, demoBool: Bool?, demoString: String?, demoNestedMessage: DemoNestedMessage?, demoRepeated: [String], demoRepeatedNestedMessage: [DemoNestedMessage]!) { + init(sizeInBytes: Int, + demoDouble: Float64?, + demoInt32: Int?, + demoInt64: Int?, + demoBool: Bool?, + demoString: String?, + demoNestedMessage: DemoNestedMessage?, + demoRepeated: [String], + demoRepeatedNestedMessage: [DemoNestedMessage]!) { self.sizeInBytes = sizeInBytes self.demoDouble = demoDouble self.demoInt32 = demoInt32 @@ -160,7 +168,14 @@ open class DemoMessage: Equatable { return DemoMessage(sizeInBytes: sizeInBytes, demoDouble: demoDouble, demoInt32: demoInt32, demoInt64: demoInt64, demoBool: demoBool, demoString: demoString, demoNestedMessage: demoNestedMessage, demoRepeated: demoRepeated, demoRepeatedNestedMessage: demoRepeatedNestedMessage) } - class func sizeOf(_ demoDouble: Float64?, demoInt32: Int?, demoInt64: Int?, demoBool: Bool?, demoString: String?, demoNestedMessage: DemoNestedMessage?, demoRepeated: [String], demoRepeatedNestedMessage: [DemoNestedMessage]!) -> Int { + class func sizeOf(_ demoDouble: Float64?, + demoInt32: Int?, + demoInt64: Int?, + demoBool: Bool?, + demoString: String?, + demoNestedMessage: DemoNestedMessage?, + demoRepeated: [String], + demoRepeatedNestedMessage: [DemoNestedMessage]!) -> Int { var n = 0 if let _ = demoDouble { @@ -271,7 +286,6 @@ open class DemoMessage: Equatable { open class func builder() -> DemoNestedMessageBuilder { return DemoNestedMessageBuilder() } - } open class DemoNestedMessageBuilder { @@ -309,8 +323,6 @@ open class DemoMessage: Equatable { return DemoNestedMessage(sizeInBytes: sizeInBytes, nestedString: nestedString, nestedInt32: nestedInt32) } } - - } open class DemoMessageBuilder {