Skip to content

Commit 0504bb8

Browse files
author
Alan Westbrook
committed
Swift 3 latest updates
* I hate that I cannot use argument labels for function typedefs any more * There's a bug with the [Any:AnyHashable] as [String:String] at the moment * type coercion has pretty much gone away. * fileprivate is *more* private
1 parent ff832cd commit 0504bb8

5 files changed

+55
-45
lines changed

Diff for: Orangered-Swift/LoginViewController.swift

+12-12
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ import Cocoa
1010

1111
let kHelpURL = URL(string: "https://www.github.com/voidref/orangered")
1212

13-
typealias LoginAction = (name:String, password:String) -> Void
13+
typealias LoginAction = (_:String, _ password:String) -> Void
1414

1515
class LoginViewController: NSViewController {
1616

17-
private let nameLabel = NSTextField()
18-
private let passwordLabel = NSTextField()
19-
private let nameField = NSTextField()
20-
private let passwordField = NSSecureTextField()
21-
private let loginButton = NSButton()
22-
private let helpButton = NSButton()
23-
private let loginAction:LoginAction
17+
fileprivate let nameLabel = NSTextField()
18+
fileprivate let passwordLabel = NSTextField()
19+
fileprivate let nameField = NSTextField()
20+
fileprivate let passwordField = NSSecureTextField()
21+
fileprivate let loginButton = NSButton()
22+
fileprivate let helpButton = NSButton()
23+
fileprivate let loginAction:LoginAction
2424

2525
init(loginAction action: LoginAction) {
2626
loginAction = action
@@ -46,7 +46,7 @@ class LoginViewController: NSViewController {
4646
view.translatesAutoresizingMaskIntoConstraints = false
4747
}
4848

49-
private func setup() {
49+
fileprivate func setup() {
5050
view.translatesAutoresizingMaskIntoConstraints = false
5151
for subview in [nameLabel, nameField, passwordLabel, passwordField, loginButton] { add(subview) }
5252

@@ -113,16 +113,16 @@ class LoginViewController: NSViewController {
113113
])
114114
}
115115

116-
private func add(_ sub:NSView) {
116+
fileprivate func add(_ sub:NSView) {
117117
sub.translatesAutoresizingMaskIntoConstraints = false
118118
view.addSubview(sub)
119119
}
120120

121121
@objc private func loginClicked() {
122-
loginAction(name: nameField.stringValue, password: passwordField.stringValue)
122+
loginAction(nameField.stringValue, passwordField.stringValue)
123123
}
124124

125-
@objc private func helpClicked() {
125+
@objc fileprivate func helpClicked() {
126126
if let urlActual = kHelpURL {
127127
NSWorkspace.shared().open(urlActual)
128128
}

Diff for: Orangered-Swift/Menu.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Menu: NSMenu {
2222
fatalError("init(coder:) has not been implemented")
2323
}
2424

25-
private func setup() {
25+
fileprivate func setup() {
2626
autoenablesItems = false
2727
}
2828
}

Diff for: Orangered-Swift/PrefViewController.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PrefViewController: NSViewController {
2626

2727
}
2828

29-
private func setup() {
29+
fileprivate func setup() {
3030
startAtLogin.target = self
3131
startAtLogin.translatesAutoresizingMaskIntoConstraints = false
3232

@@ -42,8 +42,8 @@ class PrefViewController: NSViewController {
4242
])
4343
}
4444

45-
@objc private func salClicked() {
46-
print(SMLoginItemSetEnabled("com.rockwood.Orangered", true))
45+
@objc fileprivate func salClicked() {
46+
print(SMLoginItemSetEnabled("com.rockwood.Orangered" as CFString, true))
4747
}
4848
}
4949

Diff for: Orangered-Swift/StatusItemController.swift

+34-24
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
2727
case modmail
2828
case update
2929

30-
private static let urlMap = [
30+
fileprivate static let urlMap = [
3131
loggedout: nil,
3232
invalidcredentials: nil,
3333
disconnected: nil,
@@ -75,7 +75,7 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
7575
}
7676
}
7777

78-
private var state = State.disconnected {
78+
fileprivate var state = State.disconnected {
7979
willSet {
8080
if newValue != state {
8181
// In order to avoid having to set flags for handling values set that were already set, we check `willSet`. This, however, necessitates we reschedule handling until the value is actually set as there doesn't seem to be a way to let it set and then call a method synchronously
@@ -86,17 +86,17 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
8686
}
8787
}
8888

89-
private let statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
89+
fileprivate let statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
9090

91-
private var statusPoller:Timer?
92-
private let prefs = UserDefaults.standard
93-
private var statusConnection:URLSession?
94-
private let session = URLSession.shared
95-
private var loginWindowController:NSWindowController?
96-
private var prefWindowController:NSWindowController?
97-
private var mailboxItem:NSMenuItem?
98-
private var loginItem:NSMenuItem?
99-
private var mailCount = 0
91+
fileprivate var statusPoller:Timer?
92+
fileprivate let prefs = UserDefaults.standard
93+
fileprivate var statusConnection:URLSession?
94+
fileprivate let session = URLSession.shared
95+
fileprivate var loginWindowController:NSWindowController?
96+
fileprivate var prefWindowController:NSWindowController?
97+
fileprivate var mailboxItem:NSMenuItem?
98+
fileprivate var loginItem:NSMenuItem?
99+
fileprivate var mailCount = 0
100100

101101
override init() {
102102
super.init()
@@ -108,7 +108,7 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
108108
}
109109
}
110110

111-
private func setup() {
111+
fileprivate func setup() {
112112
NSUserNotificationCenter.default.delegate = self
113113
setupMenu()
114114
}
@@ -171,13 +171,13 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
171171
loginItem?.title = kAttemptingLoginTitle
172172

173173
let task = session.dataTask(with: request) { (data, response, error) in
174-
self.handleLogin(response: response as? HTTPURLResponse, data:data, error: error)
174+
self.handleLogin(response: response, data:data, error: error)
175175
}
176-
176+
177177
task.resume()
178178
}
179179

180-
private func handleLogin(response:HTTPURLResponse?, data:Data?, error:NSError?) {
180+
fileprivate func handleLogin(response:URLResponse?, data:Data?, error:Error?) {
181181
if let dataActual = data, let
182182
dataString = String(data:dataActual, encoding:String.Encoding.utf8) {
183183
if dataString.contains("wrong password") {
@@ -197,13 +197,18 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
197197
}
198198
}
199199

200-
guard let headers = response?.allHeaderFields as? [String:String] else {
201-
print("wrong headers ... or so: \(response?.allHeaderFields)")
200+
guard let responseActual = response as? HTTPURLResponse else {
201+
print("Response is not an HTTPURLResponse, somehow: \(response)")
202+
return
203+
}
204+
205+
guard let headers = responseActual.allHeaderFields as NSDictionary? as! [String:String]? else {
206+
print("wrong headers ... or so: \(responseActual.allHeaderFields)")
202207
return
203208
}
204209

205-
guard let url = response?.url else {
206-
print("missing url from response: \(response)")
210+
guard let url = responseActual.url else {
211+
print("missing url from response: \(responseActual)")
207212
return
208213
}
209214

@@ -242,22 +247,27 @@ class StatusItemController: NSObject, NSUserNotificationCenterDelegate {
242247
window.appearance = NSAppearance(named: NSAppearanceNameVibrantLight)
243248
loginWindowController = NSWindowController(window: window)
244249

245-
NSApp.activateIgnoringOtherApps(true)
250+
NSApp.activate(ignoringOtherApps: true)
246251
loginWindowController?.showWindow(self)
247252
}
248253

249254
private func showPrefWindow() {
250255
let pref = NSWindowController(window: NSPanel(contentViewController: PrefViewController()))
251256

252257
prefWindowController = pref
253-
NSApp.activateIgnoringOtherApps(true)
258+
NSApp.activate(ignoringOtherApps: true)
254259
pref.showWindow(self)
255260
}
256261

257-
private func interpretResponse(json: AnyObject) {
262+
private func interpretResponse(json: Any) {
258263
// Crude, but remarkably immune to data restructuring as long as the key value pairs don't change.
259264

260-
guard let jsonActual = json["data"] as? [String:AnyObject] else {
265+
// WTF Swift 3...
266+
guard let jsonDict = json as AnyObject? else {
267+
return
268+
}
269+
270+
guard let jsonActual = jsonDict["data"] as? [String:AnyObject] else {
261271
print("response json unexpected format: \(json)")
262272
return
263273
}

Diff for: Orangered-Swift/UserDefaults+Orangered.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@ extension UserDefaults {
5454
}
5555

5656
// C APIs are *the worst*
57-
static private var keychainItem:SecKeychainItem? = nil
57+
static fileprivate var keychainItem:SecKeychainItem? = nil
5858

59-
private func getPassword() -> String? {
59+
fileprivate func getPassword() -> String? {
6060

6161
guard let uname = username else {
6262
print("no user name set")
6363
return nil
6464
}
6565

6666
var passwordLength:UInt32 = 0
67-
var passwordData:UnsafeMutablePointer<Void>? = nil
67+
var passwordData:UnsafeMutableRawPointer? = nil
6868

6969
let err = SecKeychainFindGenericPassword(nil,
7070
UInt32(kServiceName.characters.count),
@@ -85,7 +85,7 @@ extension UserDefaults {
8585
return nil
8686
}
8787

88-
private func setPassword(_ pass:String) {
88+
fileprivate func setPassword(_ pass:String) {
8989
guard let uname = username else {
9090
print("No username")
9191
return
@@ -111,7 +111,7 @@ extension UserDefaults {
111111
}
112112
}
113113

114-
private func updatePassword(_ password:String) {
114+
fileprivate func updatePassword(_ password:String) {
115115
guard let itemActual = UserDefaults.keychainItem else {
116116
print("Must grab a password to init the item before updatint it, bleah")
117117
return

0 commit comments

Comments
 (0)