diff --git a/Xcode/Xcode/Extensions.swift b/Xcode/Xcode/Extensions.swift index 5daa65b..1325ace 100644 --- a/Xcode/Xcode/Extensions.swift +++ b/Xcode/Xcode/Extensions.swift @@ -8,18 +8,18 @@ import Foundation -func += (inout left: Dictionary, right: Dictionary) { +func += ( left: inout Dictionary, right: Dictionary) { for (k, v) in right { left.updateValue(v, forKey: k) } } -extension SequenceType { - func ofType(type: T.Type) -> [T] { +extension Sequence { + func ofType(_ type: T.Type) -> [T] { return self.flatMap { $0 as? T } } - func any(pred: Generator.Element -> Bool) -> Bool { + func any(pred: (Iterator.Element) -> Bool) -> Bool { for elem in self { if pred(elem) { return true @@ -29,8 +29,8 @@ extension SequenceType { return false } - func groupBy(keySelector: Generator.Element -> Key) -> [Key : [Generator.Element]] { - var groupedBy = Dictionary() + func groupBy(_ keySelector: (Iterator.Element) -> Key) -> [Key : [Iterator.Element]] { + var groupedBy = Dictionary() for element in self { let key = keySelector(element) @@ -44,7 +44,7 @@ extension SequenceType { return groupedBy } - func sortBy(keySelector: Generator.Element -> U) -> [Generator.Element] { - return self.sort { keySelector($0) < keySelector($1) } + func sortBy(_ keySelector: (Iterator.Element) -> U) -> [Iterator.Element] { + return self.sorted { keySelector($0) < keySelector($1) } } -} \ No newline at end of file +} diff --git a/Xcode/Xcode/PBXObject.swift b/Xcode/Xcode/PBXObject.swift index 617260c..07dbd57 100644 --- a/Xcode/Xcode/PBXObject.swift +++ b/Xcode/Xcode/PBXObject.swift @@ -23,7 +23,7 @@ public /* abstract */ class PBXObject { self.allObjects = allObjects } - func bool(key: String) -> Bool? { + func bool(_ key: String) -> Bool? { guard let string = dict[key] as? String else { return nil } switch string { @@ -36,15 +36,15 @@ public /* abstract */ class PBXObject { } } - func string(key: String) -> String? { + func string(_ key: String) -> String? { return dict[key] as? String } - func strings(key: String) -> [String]? { + func strings(_ key: String) -> [String]? { return dict[key] as? [String] } - func object(key: String) -> T? { + func object(_ key: String) -> T? { guard let objectKey = dict[key] as? String else { return nil } @@ -53,12 +53,12 @@ public /* abstract */ class PBXObject { return obj } - func object(key: String) -> T { + func object(_ key: String) -> T { let objectKey = dict[key] as! String return allObjects.object(objectKey) } - func objects(key: String) -> [T] { + func objects(_ key: String) -> [T] { let objectKeys = dict[key] as! [String] return objectKeys.map(allObjects.object) } @@ -164,7 +164,7 @@ public class PBXGroup : PBXReference { // convenience accessors public lazy var subGroups: [PBXGroup] = self.children.ofType(PBXGroup.self) - public lazy var fileRefs: [PBXFileReference] = self.children.ofType(PBXFileReference) + public lazy var fileRefs: [PBXFileReference] = self.children.ofType(PBXFileReference.self) } public class PBXVariantGroup : PBXGroup { diff --git a/Xcode/Xcode/Serialization.swift b/Xcode/Xcode/Serialization.swift index 16b63e0..e11d378 100644 --- a/Xcode/Xcode/Serialization.swift +++ b/Xcode/Xcode/Serialization.swift @@ -10,25 +10,26 @@ import Foundation extension XCProjectFile { - public func writeToXcodeproj(xcodeprojURL url: NSURL, format: NSPropertyListFormat? = nil) throws -> Bool { + public func writeToXcodeproj(xcodeprojURL url: URL, format: PropertyListSerialization.PropertyListFormat? = nil) throws -> Bool { - try NSFileManager.defaultManager().createDirectoryAtURL(url, withIntermediateDirectories: true, attributes: nil) + try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil) - let name = try XCProjectFile.projectName(url) - guard let path = url.URLByAppendingPathComponent("project.pbxproj", isDirectory: false) else { + let name = try XCProjectFile.projectName(url: url) + guard let path = try? url.appendingPathComponent("project.pbxproj", isDirectory: false) else { throw ProjectFileError.MissingPbxproj } let serializer = Serializer(projectName: name, projectFile: self) let plformat = format ?? self.format - if plformat == NSPropertyListFormat.OpenStepFormat { - try serializer.openStepSerialization.writeToURL(path, atomically: true, encoding: NSUTF8StringEncoding) + if plformat == PropertyListSerialization.PropertyListFormat.openStep { + try serializer.openStepSerialization.write(to: path, atomically: true, encoding: String.Encoding.utf8) return true } else { - let data = try NSPropertyListSerialization.dataWithPropertyList(dict, format: plformat, options: 0) - return data.writeToURL(path, atomically: true) + let data = try PropertyListSerialization.data(fromPropertyList: dict, format: plformat, options: 0) + try data.write(to: path, options: [.atomic]) + return true } } @@ -36,22 +37,22 @@ extension XCProjectFile { let serializer = Serializer(projectName: projectName, projectFile: self) - if format == NSPropertyListFormat.OpenStepFormat { - return serializer.openStepSerialization.dataUsingEncoding(NSUTF8StringEncoding)! + if format == PropertyListSerialization.PropertyListFormat.openStep { + return serializer.openStepSerialization.data(using: String.Encoding.utf8)! } else { - return try NSPropertyListSerialization.dataWithPropertyList(dict, format: format, options: 0) + return try PropertyListSerialization.data(fromPropertyList: dict, format: format, options: 0) } } } -let nonescapeRegex = try! NSRegularExpression(pattern: "^[a-z0-9_\\.\\/]+$", options: NSRegularExpressionOptions.CaseInsensitive) +let nonescapeRegex = try! RegularExpression(pattern: "^[a-z0-9_\\.\\/]+$", options: [.caseInsensitive]) let specialRegexes = [ - "\\\\": try! NSRegularExpression(pattern: "\\\\", options: []), - "\\\"": try! NSRegularExpression(pattern: "\"", options: []), - "\\n": try! NSRegularExpression(pattern: "\\n", options: []), - "\\r": try! NSRegularExpression(pattern: "\\r", options: []), - "\\t": try! NSRegularExpression(pattern: "\\t", options: []), + "\\\\": try! RegularExpression(pattern: "\\\\", options: []), + "\\\"": try! RegularExpression(pattern: "\"", options: []), + "\\n": try! RegularExpression(pattern: "\\n", options: []), + "\\r": try! RegularExpression(pattern: "\\r", options: []), + "\\t": try! RegularExpression(pattern: "\\t", options: []), ] internal class Serializer { @@ -75,7 +76,7 @@ internal class Serializer { lazy var buildPhaseByFileId: [String: PBXBuildPhase] = { - let buildPhases = self.projectFile.allObjects.dict.values.ofType(PBXBuildPhase) + let buildPhases = self.projectFile.allObjects.dict.values.ofType(PBXBuildPhase.self) var dict: [String: PBXBuildPhase] = [:] for buildPhase in buildPhases { @@ -93,7 +94,7 @@ internal class Serializer { "{", ] - for key in projectFile.dict.keys.sort() { + for key in projectFile.dict.keys.sorted() { let val: AnyObject = projectFile.dict[key]! if key == "objects" { @@ -112,14 +113,14 @@ internal class Serializer { let multiline = isa != "PBXBuildFile" && isa != "PBXFileReference" - let parts = rows(isa, objKey: object.id, multiline: multiline, dict: object.dict) + let parts = rows(type: isa, objKey: object.id, multiline: multiline, dict: object.dict) if multiline { for ln in parts { lines.append("\t\t" + ln) } } else { - lines.append("\t\t" + parts.joinWithSeparator("")) + lines.append("\t\t" + parts.joined(separator: "")) } } @@ -134,7 +135,7 @@ internal class Serializer { } let row = "\(key) = \(val)\(comment);" - for line in row.componentsSeparatedByString("\n") { + for line in row.components(separatedBy: "\n") { lines.append("\t\(line)") } } @@ -142,10 +143,10 @@ internal class Serializer { lines.append("}\n") - return lines.joinWithSeparator("\n") + return lines.joined(separator: "\n") } - func comment(key: String) -> String? { + func comment(_ key: String) -> String? { if key == projectFile.project.id { return "Project object" } @@ -205,24 +206,24 @@ internal class Serializer { return nil } - func valStr(val: String) -> String { + func valStr(_ val: String) -> String { var str = val for (replacement, regex) in specialRegexes { let range = NSRange(location: 0, length: str.utf16.count) - let template = NSRegularExpression.escapedTemplateForString(replacement) - str = regex.stringByReplacingMatchesInString(str, options: [], range: range, withTemplate: template) + let template = RegularExpression.escapedTemplate(for: replacement) + str = regex.stringByReplacingMatches(in: str, options: [], range: range, withTemplate: template) } let range = NSRange(location: 0, length: str.utf16.count) - if let _ = nonescapeRegex.firstMatchInString(str, options: [], range: range) { + if let _ = nonescapeRegex.firstMatch(in: str, options: [], range: range) { return str } return "\"\(str)\"" } - func objval(key: String, val: AnyObject, multiline: Bool) -> [String] { + func objval(_ key: String, val: AnyObject, multiline: Bool) -> [String] { var parts: [String] = [] let keyStr = valStr(key) @@ -247,7 +248,7 @@ internal class Serializer { parts.append(");") } else { - parts.append(ps.map { $0 + " "}.joinWithSeparator("") + "); ") + parts.append(ps.map { $0 + " "}.joined(separator: "") + "); ") } } @@ -259,7 +260,7 @@ internal class Serializer { parts.append("\t{") } - for valKey in valObj.keys.sort() { + for valKey in valObj.keys.sorted() { let valVal: AnyObject = valObj[valKey]! let ps = objval(valKey, val: valVal, multiline: multiline) @@ -269,7 +270,7 @@ internal class Serializer { } } else { - parts.append("\t" + ps.joinWithSeparator("") + "}; ") + parts.append("\t" + ps.joined(separator: "") + "}; ") } } @@ -284,7 +285,7 @@ internal class Serializer { else if let valObj = val as? JsonObject { parts.append("\(keyStr) = {") - for valKey in valObj.keys.sort() { + for valKey in valObj.keys.sorted() { let valVal: AnyObject = valObj[valKey]! let ps = objval(valKey, val: valVal, multiline: multiline) @@ -294,7 +295,7 @@ internal class Serializer { } } else { - parts.append(ps.joinWithSeparator("") + "}; ") + parts.append(ps.joined(separator: "") + "}; ") } } @@ -336,7 +337,7 @@ internal class Serializer { parts.append("isa = \(type); ") } - for key in dict.keys.sort() { + for key in dict.keys.sorted() { if key == "isa" { continue } let val: AnyObject = dict[key]! @@ -363,7 +364,7 @@ internal class Serializer { return lines } else { - return [opening + parts.joinWithSeparator("") + closing] + return [opening + parts.joined(separator: "") + closing] } } } diff --git a/Xcode/Xcode/XCProjectFile.swift b/Xcode/Xcode/XCProjectFile.swift index 054bf6c..4ec138d 100644 --- a/Xcode/Xcode/XCProjectFile.swift +++ b/Xcode/Xcode/XCProjectFile.swift @@ -8,7 +8,7 @@ import Foundation -enum ProjectFileError : ErrorType, CustomStringConvertible { +enum ProjectFileError : ErrorProtocol, CustomStringConvertible { case InvalidData case NotXcodeproj case MissingPbxproj @@ -29,7 +29,7 @@ public class AllObjects { var dict: [String: PBXObject] = [:] var fullFilePaths: [String: Path] = [:] - func object(key: String) -> T { + func object(_ key: String) -> T { let obj = dict[key]! if let t = obj as? T { return t @@ -42,14 +42,13 @@ public class AllObjects { public class XCProjectFile { public let project: PBXProject let dict: JsonObject - var format: NSPropertyListFormat + var format: PropertyListSerialization.PropertyListFormat let allObjects = AllObjects() - public convenience init(xcodeprojURL: NSURL) throws { + public convenience init(xcodeprojURL: URL) throws { - - guard let pbxprojURL = xcodeprojURL.URLByAppendingPathComponent("project.pbxproj", isDirectory: false), - data = NSData(contentsOfURL: pbxprojURL) else { + guard let pbxprojURL = try? xcodeprojURL.appendingPathComponent("project.pbxproj", isDirectory: false), + data = NSData(contentsOf: pbxprojURL) else { throw ProjectFileError.MissingPbxproj } @@ -58,9 +57,9 @@ public class XCProjectFile { public convenience init(propertyListData data: NSData) throws { - let options = NSPropertyListReadOptions.Immutable - var format: NSPropertyListFormat = NSPropertyListFormat.BinaryFormat_v1_0 - let obj = try NSPropertyListSerialization.propertyListWithData(data, options: options, format: &format) + let options = PropertyListSerialization.ReadOptions() + var format: PropertyListSerialization.PropertyListFormat = PropertyListSerialization.PropertyListFormat.binary + let obj = try PropertyListSerialization.propertyList(from: data as Data, options: options, format: &format) guard let dict = obj as? JsonObject else { throw ProjectFileError.InvalidData @@ -69,13 +68,13 @@ public class XCProjectFile { self.init(dict: dict, format: format) } - init(dict: JsonObject, format: NSPropertyListFormat) { + init(dict: JsonObject, format: PropertyListSerialization.PropertyListFormat) { self.dict = dict self.format = format let objects = dict["objects"] as! [String: JsonObject] for (key, obj) in objects { - allObjects.dict[key] = XCProjectFile.createObject(key, dict: obj, allObjects: allObjects) + allObjects.dict[key] = XCProjectFile.createObject(id: key, dict: obj, allObjects: allObjects) } let rootObjectId = dict["rootObject"]! as! String @@ -84,16 +83,16 @@ public class XCProjectFile { self.allObjects.fullFilePaths = paths(self.project.mainGroup, prefix: "") } - static func projectName(url: NSURL) throws -> String { + static func projectName(url: URL) throws -> String { guard let subpaths = url.pathComponents, let last = subpaths.last, - let range = last.rangeOfString(".xcodeproj") + let range = last.range(of: ".xcodeproj") else { throw ProjectFileError.NotXcodeproj } - return last.substringToIndex(range.startIndex) + return last.substring(to: range.lowerBound) } static func createObject(id: String, dict: JsonObject, allObjects: AllObjects) -> PBXObject { @@ -109,7 +108,7 @@ public class XCProjectFile { return PBXObject(id: id, dict: dict, allObjects: allObjects) } - func paths(current: PBXGroup, prefix: String) -> [String: Path] { + func paths(_ current: PBXGroup, prefix: String) -> [String: Path] { var ps: [String: Path] = [:]