diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 989564fe..2034030a 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -157,7 +157,7 @@ class InputState { /// Represents that the user is marking a range in the composing buffer. class Marking: NotEmpty { private(set) var markerIndex: Int = 0 { didSet { markerIndex = max(markerIndex, 0) } } - private(set) var markedRange: NSRange + private(set) var markedRange: Range private var deleteTargetExists = false var tooltip: String { if composingBuffer.count != readings.count { @@ -172,19 +172,19 @@ class InputState { "⚠︎ Phrase replacement mode enabled, interfering user phrase entry.", comment: "" ) } - if markedRange.length == 0 { + if markedRange.isEmpty { return "" } let text = composingBuffer.utf16SubString(with: markedRange) - if markedRange.length < kMinMarkRangeLength { + if markedRange.count < kMinMarkRangeLength { ctlInputMethod.tooltipController.setColor(state: .denialInsufficiency) return String( format: NSLocalizedString( "\"%@\" length must β‰₯ 2 for a user phrase.", comment: "" ), text ) - } else if markedRange.length > kMaxMarkRangeLength { + } else if markedRange.count > kMaxMarkRangeLength { ctlInputMethod.tooltipController.setColor(state: .denialOverflow) return String( format: NSLocalizedString( @@ -194,9 +194,8 @@ class InputState { ) } - let (exactBegin, _) = composingBuffer.utf16CharIndex(from: markedRange.location) - let (exactEnd, _) = composingBuffer.utf16CharIndex( - from: markedRange.location + markedRange.length) + let exactBegin = composingBuffer.utf16CharIndex(from: markedRange.lowerBound) + let exactEnd = composingBuffer.utf16CharIndex(from: markedRange.upperBound) let selectedReadings = readings[exactBegin.. kMaxMarkRangeLength { + if markedRange.count > kMaxMarkRangeLength { return false } if ctlInputMethod.areWeDeleting, !deleteTargetExists { return false } - return markedRange.length >= kMinMarkRangeLength - && markedRange.length <= kMaxMarkRangeLength + return markedRange.count >= kMinMarkRangeLength + && markedRange.count <= kMaxMarkRangeLength } var chkIfUserPhraseExists: Bool { let text = composingBuffer.utf16SubString(with: markedRange) - let (exactBegin, _) = composingBuffer.utf16CharIndex(from: markedRange.location) - let (exactEnd, _) = composingBuffer.utf16CharIndex( - from: markedRange.location + markedRange.length) + let exactBegin = composingBuffer.utf16CharIndex(from: markedRange.lowerBound) + let exactEnd = composingBuffer.utf16CharIndex(from: markedRange.upperBound) let selectedReadings = readings[exactBegin.. (Int, String) { - let string = self + public func utf16CharIndex(from utf16Index: Int) -> Int { var length = 0 - for (i, character) in string.enumerated() { + for (i, character) in self.enumerated() { length += character.utf16.count if length > utf16Index { - return (i, string) + return (i) } } - return (string.count, string) + return count } public func utf16NextPosition(for index: Int) -> Int { - var (fixedIndex, string) = utf16CharIndex(from: index) - if fixedIndex < string.count { - fixedIndex += 1 - } - return string[.. Int { - var (fixedIndex, string) = utf16CharIndex(from: index) - if fixedIndex > 0 { - fixedIndex -= 1 - } - return string[.. String { - (self as NSString).substring(with: range) + func utf16SubString(with r: Range) -> String { + let arr = Array(self.utf16)[r].map { $0 } + return String(utf16CodeUnits: arr, count: arr.count) } }