Uncategorized
Mix String and NSString in NSRegularExpression methods is error prone.
String use UTF8 coding (it see characters with variable lengths) while
NSString uses UTF16 behind (it sees characters all occupying 2 bytes).
For example, an emoji character counts as 2 UTF16 code points in NSString, but
count as 1 Unicode EGC (Extended Grapheme Cluster)code point in String.
let s = "🌹"
s.count // 1
let ss = s as NSString
ss.length // 2Hence when matching
let text: String = ...
let regex = ...
let msgMatch = msgRegex.firstMatch(
in: newText,
options: [],
range: NSMakeRange(0, text.length) // WRONG
range: NSMakeRange(0, (text as NSString).length) // RIGHT
)!
// WRONG
let captured = text.substring(with: msgMatch.range(at: 2))
// RIGHT
let captured = (text as NSString).substring(with: msgMatch.range(at: 2))About Swift.Range and NSRange see this
SO
article.
Use the KeyPath version of KVO after Swift 4, Xcode panics with:
fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath …
Add @objcMember to the KVO’ed class, or add @objc to KVO’ed property.
1class B: NSObject {
2 @objc dynamic var value = "a"
3}
4
5let keyPath = ...
6b.observe(keyPath, options: [.new, .old, .prior, .initial]) { value, change in
7 if change.kind == .setting {
8 dump(object)
9 dump(change)
10 }
11}When declare CodingKeys for nested types Xcode panics with:
Ambiguous reference to CodingKeys,
Declare it as private private enum CodingKeys: CodingKey, String
Xcode
When trying to run app in real device, Xcode alerts with:
Could not connect to …
- Check if airline mode is on, turn off if yes and re-run the app.