Post

Replies

Boosts

Views

Activity

FileMerge won't run on macOS 12.7
I am still on Xcode 14.3 and my macOS is version 12.7 (21G816). Today I am surprised to find out that FileMerge tool won't run when I invoke it from Xcode "Open Developer Tool" menu. Is there a standalone download for this tool? Or is there any better alternatives to it?
2
0
764
Oct ’23
Need help on generics where clause
I have the following class: /// Act as a reference container for value types. public class ValueBox<ValueType: ??> { public var value: ValueType public init() { value = ValueType() // Compiler error } public init(_ value: ValueType) { self.value = value } } Is it possible to specify the generic type ValueType can be inited?
1
0
306
Oct ’23
Weird error with HTTPS connection
I have a weird problem with HTTPS connection. Task <A19A5441-F5CD-4F8C-8C88-73FC679D8AE0>.<1> finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." I am trying to bypass server certificate of my website because it's self-signed. The following code works in a test app, but not in another app. They have exactly have the same entitlements: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.files.user-selected.read-write</key> <true/> <key>com.apple.security.network.client</key> <true/> </dict> </plist> func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { let protectionSpace = challenge.protectionSpace guard protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, protectionSpace.host.contains("mywebsite.net") else { completionHandler(.performDefaultHandling, nil) return } guard let serverTrust = protectionSpace.serverTrust else { completionHandler(.performDefaultHandling, nil) return } let credential = URLCredential(trust: serverTrust) completionHandler(.useCredential, credential) } @IBAction func testMenuItem_select(_ sender: Any) { print("\(sender)") Preferences.instance.openTipShowed = false testURLSession() func testURLSession() { let session = URLSession(configuration: URLSessionConfiguration.ephemeral, delegate: self, delegateQueue: nil) let url2 = "https://www.mywebsite.net/spiders.txt" let url3 = "https://www.apple.com/" let url = URL(string: url2)! var request = URLRequest(url: url) let task = session.dataTask(with: request) { data, response, error in if let error { print(error) } if let data { let text = String(data: data, encoding: .utf8) print("HTTP response object:", response ?? "") print("HTTP resonse text:", text ?? "<empty response>") } } task.resume() } }
1
0
717
Oct ’23
Need help on Array and API design
I am working on an app which I plan to submit to App Store in 2 weeks. Now I have a headache with Array type. I have the following API design in my app: class SomeParser { func getTranslations(_ locale: String) -> [TranslationUnit]? { // Check if the locale units are already in a cache, if not build a new list // and return the list } } class MainVC { func doTranslation() { var list = parser.getTranslation("en") // Modify some units in the list. // How to put it back to cache? } } Now the problem is that since Array is a value type, the modified list is isolated. The only way to reflect the changes into cache is put the modified list back to cache: translationCache[locale] = modifiedList But this is counter-intuitive and waste of performance. Is there anyway to workaround this problem?
1
0
417
Oct ’23
Any way to get array by reference?
Today I spent one hour to get myself educated on Array type. I have the following class in one of my app: class PathNode: Hashable, Comparable, CustomStringConvertible { var name: String! var path: String! var children: [PathNode]? static func == (lhs: PathNode, rhs: PathNode) -> Bool { lhs.name == rhs.name } static func < (lhs: PathNode, rhs: PathNode) -> Bool { lhs.name < rhs.name } func hash(into hasher: inout Hasher) { hasher.combine(name) hasher.combine(children) } /// Sort child nodes. func sort() { if let children = self.children { children.sort() for child in children { child.sort() } } } // other members... } The problem is in the sort function. I found out in my outline view the result is not sorted even though I did call sort on the root node. After about one hour's frustration, I came to realize that I forgot one import fact about the array type in Swift - it's a value type! I have to adjust sort function to the following code: /// Sort child nodes. func sort() { if self.children != nil { self.children!.sort() for child in self.children! { child.sort() } } } That's not an elegant way of writing code! Is there any other way to get a 'reference' to an array in Swift?
2
0
429
Sep ’23
Symbol navigator is polluted with thousands of system classes!
I have a test app. I added some extension classes to one of source code like below: extension String { func addPathComponent(_ path: String) -> String { return (self as NSString).appendingPathComponent(path) } func sameText(with: String) -> Bool { return self.caseInsensitiveCompare(with) == .orderedSame } var isBlank: Bool { allSatisfy { $0.isWhitespace } } } extension Optional where Wrapped == String { var isBlank: Bool { self?.isBlank ?? true } } Now the symbol navigator is polluted with many system classes: BTW, I am using Xcode 14.3.1.
1
0
628
Sep ’23
Extension method for Optional of String
I came across an article about extension of Optional (https://useyourloaf.com/blog/empty-strings-in-swift/), but I cannot get it to work for the Optional extension. extension Optional where Wrapped == String { var isBlank: Bool { return self?.isBlank ?? true } } func testIsBlank() { for s in [nil, "", " ", "\t", "abc"] { print(s?.isBlank) } } For nil value, the output is still nil. I see the article is quite old dated back in 2019. There must be some changes in the language specs. What's going on here?
1
0
685
Sep ’23
switch case and === operator
I have the following code: func numberOfRows(in tableView: NSTableView) -> Int { switch tableView { case self.stringsTable: return self.stringsList?.count ?? 0 case self.localeTable: return self.localeMap.count default: print("numberOfRows not handled for \(tableView)") return 0 } } I wonder if there is any (performance) difference between case and ==== operator like below: func numberOfRows(in tableView: NSTableView) -> Int { if tableView === self.stringsTable { } // ... }
3
0
490
Sep ’23
Ensure value in a Dictionary
In many cases, I need to get the value from a dictionary given a key (usually a string). I have the following helper class: public class ObjectCache<T> { private var cache = [String: T]() subscript(name: String) -> T? { get { return cache[name] } set { cache[name] = newValue } } func get(_ name: String, with builder: () -> T?) -> T? { var obj = cache[name] if obj == nil { obj = builder() cache[name] = obj } return obj } } This saves much keyboard typing and avoid common errors of oversight. Like below: let serviceURL = self.urlCache.get(name) { return comp.url }! Now my question is - Does Swift provide some builtin functionality like this? I just hope I did not re-event the wheel.
1
0
375
Sep ’23
FileMerge won't run on macOS 12.7
I am still on Xcode 14.3 and my macOS is version 12.7 (21G816). Today I am surprised to find out that FileMerge tool won't run when I invoke it from Xcode "Open Developer Tool" menu. Is there a standalone download for this tool? Or is there any better alternatives to it?
Replies
2
Boosts
0
Views
764
Activity
Oct ’23
Is it possible to get current executing function's name?
In other languages, I am able to get current function's name using some kind of so-called reflection API. Does Swift provide similar API?
Replies
2
Boosts
0
Views
456
Activity
Oct ’23
Need help on generics where clause
I have the following class: /// Act as a reference container for value types. public class ValueBox<ValueType: ??> { public var value: ValueType public init() { value = ValueType() // Compiler error } public init(_ value: ValueType) { self.value = value } } Is it possible to specify the generic type ValueType can be inited?
Replies
1
Boosts
0
Views
306
Activity
Oct ’23
Need advices on NSMutableArray in Swift
I am having coding design difficulties with Array in Swift, see this post. So I decided to turn to the old NSMutableArray. I'd like to know if there are any known problems of this approach. Any pitfalls and known practices?
Replies
2
Boosts
0
Views
441
Activity
Oct ’23
Weird error with HTTPS connection
I have a weird problem with HTTPS connection. Task <A19A5441-F5CD-4F8C-8C88-73FC679D8AE0>.<1> finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." I am trying to bypass server certificate of my website because it's self-signed. The following code works in a test app, but not in another app. They have exactly have the same entitlements: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.files.user-selected.read-write</key> <true/> <key>com.apple.security.network.client</key> <true/> </dict> </plist> func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { let protectionSpace = challenge.protectionSpace guard protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, protectionSpace.host.contains("mywebsite.net") else { completionHandler(.performDefaultHandling, nil) return } guard let serverTrust = protectionSpace.serverTrust else { completionHandler(.performDefaultHandling, nil) return } let credential = URLCredential(trust: serverTrust) completionHandler(.useCredential, credential) } @IBAction func testMenuItem_select(_ sender: Any) { print("\(sender)") Preferences.instance.openTipShowed = false testURLSession() func testURLSession() { let session = URLSession(configuration: URLSessionConfiguration.ephemeral, delegate: self, delegateQueue: nil) let url2 = "https://www.mywebsite.net/spiders.txt" let url3 = "https://www.apple.com/" let url = URL(string: url2)! var request = URLRequest(url: url) let task = session.dataTask(with: request) { data, response, error in if let error { print(error) } if let data { let text = String(data: data, encoding: .utf8) print("HTTP response object:", response ?? "") print("HTTP resonse text:", text ?? "<empty response>") } } task.resume() } }
Replies
1
Boosts
0
Views
717
Activity
Oct ’23
Need help on Array and API design
I am working on an app which I plan to submit to App Store in 2 weeks. Now I have a headache with Array type. I have the following API design in my app: class SomeParser { func getTranslations(_ locale: String) -> [TranslationUnit]? { // Check if the locale units are already in a cache, if not build a new list // and return the list } } class MainVC { func doTranslation() { var list = parser.getTranslation("en") // Modify some units in the list. // How to put it back to cache? } } Now the problem is that since Array is a value type, the modified list is isolated. The only way to reflect the changes into cache is put the modified list back to cache: translationCache[locale] = modifiedList But this is counter-intuitive and waste of performance. Is there anyway to workaround this problem?
Replies
1
Boosts
0
Views
417
Activity
Oct ’23
How make a var modifiable but not assignable?
Suppose I have the following class: class Some { var list = [String]() } // In other places, I want to append to the list someInstance.list.append("new string") // ...but I do not want to re-assign the list itself: someInstance.list = [String]() What is the exact syntax for declaring list?
Replies
2
Boosts
0
Views
436
Activity
Oct ’23
Any way to get array by reference?
Today I spent one hour to get myself educated on Array type. I have the following class in one of my app: class PathNode: Hashable, Comparable, CustomStringConvertible { var name: String! var path: String! var children: [PathNode]? static func == (lhs: PathNode, rhs: PathNode) -> Bool { lhs.name == rhs.name } static func < (lhs: PathNode, rhs: PathNode) -> Bool { lhs.name < rhs.name } func hash(into hasher: inout Hasher) { hasher.combine(name) hasher.combine(children) } /// Sort child nodes. func sort() { if let children = self.children { children.sort() for child in children { child.sort() } } } // other members... } The problem is in the sort function. I found out in my outline view the result is not sorted even though I did call sort on the root node. After about one hour's frustration, I came to realize that I forgot one import fact about the array type in Swift - it's a value type! I have to adjust sort function to the following code: /// Sort child nodes. func sort() { if self.children != nil { self.children!.sort() for child in self.children! { child.sort() } } } That's not an elegant way of writing code! Is there any other way to get a 'reference' to an array in Swift?
Replies
2
Boosts
0
Views
429
Activity
Sep ’23
Symbol navigator is polluted with thousands of system classes!
I have a test app. I added some extension classes to one of source code like below: extension String { func addPathComponent(_ path: String) -> String { return (self as NSString).appendingPathComponent(path) } func sameText(with: String) -> Bool { return self.caseInsensitiveCompare(with) == .orderedSame } var isBlank: Bool { allSatisfy { $0.isWhitespace } } } extension Optional where Wrapped == String { var isBlank: Bool { self?.isBlank ?? true } } Now the symbol navigator is polluted with many system classes: BTW, I am using Xcode 14.3.1.
Replies
1
Boosts
0
Views
628
Activity
Sep ’23
Extension method for Optional of String
I came across an article about extension of Optional (https://useyourloaf.com/blog/empty-strings-in-swift/), but I cannot get it to work for the Optional extension. extension Optional where Wrapped == String { var isBlank: Bool { return self?.isBlank ?? true } } func testIsBlank() { for s in [nil, "", " ", "\t", "abc"] { print(s?.isBlank) } } For nil value, the output is still nil. I see the article is quite old dated back in 2019. There must be some changes in the language specs. What's going on here?
Replies
1
Boosts
0
Views
685
Activity
Sep ’23
Get row index when user click a button in NSTableCellView
I have a checkbox button in a table column (of course in a NSTableCellView). @IBAction func check_click(_ sender: Any) { // How do I know in which row this event occurred? // Once I get the row index I get the associated data item so that I can update the checked state. }
Replies
2
Boosts
0
Views
561
Activity
Sep ’23
switch case and === operator
I have the following code: func numberOfRows(in tableView: NSTableView) -> Int { switch tableView { case self.stringsTable: return self.stringsList?.count ?? 0 case self.localeTable: return self.localeMap.count default: print("numberOfRows not handled for \(tableView)") return 0 } } I wonder if there is any (performance) difference between case and ==== operator like below: func numberOfRows(in tableView: NSTableView) -> Int { if tableView === self.stringsTable { } // ... }
Replies
3
Boosts
0
Views
490
Activity
Sep ’23
Ensure value in a Dictionary
In many cases, I need to get the value from a dictionary given a key (usually a string). I have the following helper class: public class ObjectCache<T> { private var cache = [String: T]() subscript(name: String) -> T? { get { return cache[name] } set { cache[name] = newValue } } func get(_ name: String, with builder: () -> T?) -> T? { var obj = cache[name] if obj == nil { obj = builder() cache[name] = obj } return obj } } This saves much keyboard typing and avoid common errors of oversight. Like below: let serviceURL = self.urlCache.get(name) { return comp.url }! Now my question is - Does Swift provide some builtin functionality like this? I just hope I did not re-event the wheel.
Replies
1
Boosts
0
Views
375
Activity
Sep ’23
How expand first root node when NSOutlineView is done with loading
I want to expand the first only root node when NSOutlineView is finished loading all data. How to get notified in code (possibly by some delegate function)?
Replies
1
Boosts
0
Views
407
Activity
Sep ’23
How to implement similar navigation bar like what we have in Xcode?
Can anyone give any clues about how the navigation bar is implemented like below?
Replies
0
Boosts
0
Views
454
Activity
Sep ’23