diff --git a/Source/Modules/ControllerModules/InputSignal.swift b/Source/Modules/ControllerModules/InputSignal.swift index 4bc1acbb..c972f704 100644 --- a/Source/Modules/ControllerModules/InputSignal.swift +++ b/Source/Modules/ControllerModules/InputSignal.swift @@ -110,8 +110,11 @@ enum KeyCodeBlackListed: UInt16 { } // CharCodes: https://theasciicode.com.ar/ascii-control-characters/horizontal-tab-ascii-code-9.html -enum CharCode: UInt /* 16 */ { - case yajuusenpai = 114_514_191_191_810_893 +enum CharCode: UInt16 { + case yajuusenpaiA = 114 + case yajuusenpaiB = 514 + case yajuusenpaiC = 1919 + case yajuusenpaiD = 810 // CharCode is not reliable at all. KeyCode is the most appropriate choice due to its accuracy. // KeyCode doesn't give a phuque about the character sent through macOS keyboard layouts ... // ... but only focuses on which physical key is pressed. diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 5931723e..989564fe 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -110,9 +110,9 @@ class InputState { /// Represents that the composing buffer is not empty. class NotEmpty: InputState { private(set) var composingBuffer: String - private(set) var cursorIndex: UInt + private(set) var cursorIndex: Int = 0 { didSet { cursorIndex = max(cursorIndex, 0) } } - init(composingBuffer: String, cursorIndex: UInt) { + init(composingBuffer: String, cursorIndex: Int) { self.composingBuffer = composingBuffer self.cursorIndex = cursorIndex } @@ -129,7 +129,7 @@ class InputState { var poppedText: String = "" var tooltip: String = "" - override init(composingBuffer: String, cursorIndex: UInt) { + override init(composingBuffer: String, cursorIndex: Int) { super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex) } @@ -156,7 +156,7 @@ class InputState { /// Represents that the user is marking a range in the composing buffer. class Marking: NotEmpty { - private(set) var markerIndex: UInt + private(set) var markerIndex: Int = 0 { didSet { markerIndex = max(markerIndex, 0) } } private(set) var markedRange: NSRange private var deleteTargetExists = false var tooltip: String { @@ -176,7 +176,7 @@ class InputState { return "" } - let text = composingBuffer.substring(with: markedRange) + let text = composingBuffer.utf16SubString(with: markedRange) if markedRange.length < kMinMarkRangeLength { ctlInputMethod.tooltipController.setColor(state: .denialInsufficiency) return String( @@ -221,11 +221,11 @@ class InputState { var tooltipForInputting: String = "" private(set) var readings: [String] - init(composingBuffer: String, cursorIndex: UInt, markerIndex: UInt, readings: [String]) { + init(composingBuffer: String, cursorIndex: Int, markerIndex: Int, readings: [String]) { self.markerIndex = markerIndex let begin = min(cursorIndex, markerIndex) let end = max(cursorIndex, markerIndex) - markedRange = NSRange(location: Int(begin), length: Int(end - begin)) + markedRange = NSRange(location: begin, length: end - begin) self.readings = readings super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex) } @@ -291,7 +291,7 @@ class InputState { } var chkIfUserPhraseExists: Bool { - let text = composingBuffer.substring(with: markedRange) + let text = composingBuffer.utf16SubString(with: markedRange) let (exactBegin, _) = composingBuffer.utf16CharIndex(from: markedRange.location) let (exactEnd, _) = composingBuffer.utf16CharIndex( from: markedRange.location + markedRange.length) @@ -303,7 +303,7 @@ class InputState { } var userPhrase: String { - let text = composingBuffer.substring(with: markedRange) + let text = composingBuffer.utf16SubString(with: markedRange) let (exactBegin, _) = composingBuffer.utf16CharIndex(from: markedRange.location) let (exactEnd, _) = composingBuffer.utf16CharIndex( from: markedRange.location + markedRange.length) @@ -314,7 +314,7 @@ class InputState { var userPhraseConverted: String { let text = - OpenCCBridge.crossConvert(composingBuffer.substring(with: markedRange)) ?? "" + OpenCCBridge.crossConvert(composingBuffer.utf16SubString(with: markedRange)) ?? "" let (exactBegin, _) = composingBuffer.utf16CharIndex(from: markedRange.location) let (exactEnd, _) = composingBuffer.utf16CharIndex( from: markedRange.location + markedRange.length) @@ -332,7 +332,7 @@ class InputState { private(set) var candidates: [String] private(set) var useVerticalMode: Bool - init(composingBuffer: String, cursorIndex: UInt, candidates: [String], useVerticalMode: Bool) { + init(composingBuffer: String, cursorIndex: Int, candidates: [String], useVerticalMode: Bool) { self.candidates = candidates self.useVerticalMode = useVerticalMode super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex) diff --git a/Source/Modules/ControllerModules/KeyHandler_HandleCandidate.swift b/Source/Modules/ControllerModules/KeyHandler_HandleCandidate.swift index 7c631905..8b9e6eae 100644 --- a/Source/Modules/ControllerModules/KeyHandler_HandleCandidate.swift +++ b/Source/Modules/ControllerModules/KeyHandler_HandleCandidate.swift @@ -71,7 +71,7 @@ extension KeyHandler { } delegate!.keyHandler( self, - didSelectCandidateAt: Int(ctlCandidateCurrent.selectedCandidateIndex), + didSelectCandidateAt: ctlCandidateCurrent.selectedCandidateIndex, ctlCandidate: ctlCandidateCurrent ) return true @@ -260,11 +260,11 @@ extension KeyHandler { return false } else { // 這裡不用「count > 0」,因為該整數變數只要「!isEmpty」那就必定滿足這個條件。 if input.isEnd || input.emacsKey == vChewingEmacsKey.end { - if ctlCandidateCurrent.selectedCandidateIndex == UInt(candidates.count - 1) { + if ctlCandidateCurrent.selectedCandidateIndex == candidates.count - 1 { IME.prtDebugIntel("9B69AAAD") errorCallback() } else { - ctlCandidateCurrent.selectedCandidateIndex = UInt(candidates.count - 1) + ctlCandidateCurrent.selectedCandidateIndex = candidates.count - 1 } } } @@ -294,10 +294,10 @@ extension KeyHandler { } if index != NSNotFound { - let candidateIndex: UInt = ctlCandidateCurrent.candidateIndexAtKeyLabelIndex(UInt(index)) - if candidateIndex != UInt.max { + let candidateIndex = ctlCandidateCurrent.candidateIndexAtKeyLabelIndex(index) + if candidateIndex != Int.max { delegate!.keyHandler( - self, didSelectCandidateAt: Int(candidateIndex), ctlCandidate: ctlCandidateCurrent + self, didSelectCandidateAt: candidateIndex, ctlCandidate: ctlCandidateCurrent ) return true } @@ -342,11 +342,11 @@ extension KeyHandler { } if shouldAutoSelectCandidate { - let candidateIndex: UInt = ctlCandidateCurrent.candidateIndexAtKeyLabelIndex(0) - if candidateIndex != UInt.max { + let candidateIndex = ctlCandidateCurrent.candidateIndexAtKeyLabelIndex(0) + if candidateIndex != Int.max { delegate!.keyHandler( self, - didSelectCandidateAt: Int(candidateIndex), + didSelectCandidateAt: candidateIndex, ctlCandidate: ctlCandidateCurrent ) clear() diff --git a/Source/Modules/ControllerModules/KeyHandler_States.swift b/Source/Modules/ControllerModules/KeyHandler_States.swift index e4b963a8..ff5b2fb5 100644 --- a/Source/Modules/ControllerModules/KeyHandler_States.swift +++ b/Source/Modules/ControllerModules/KeyHandler_States.swift @@ -114,7 +114,7 @@ extension KeyHandler { let composedText = head + reading + tail let cursorIndex = composedStringCursorIndex + reading.utf16.count - let stateResult = InputState.Inputting(composingBuffer: composedText, cursorIndex: UInt(cursorIndex)) + let stateResult = InputState.Inputting(composingBuffer: composedText, cursorIndex: cursorIndex) // Now we start weaving the contents of the tooltip. if tooltipParameterRef[0].isEmpty, tooltipParameterRef[1].isEmpty { @@ -206,7 +206,7 @@ extension KeyHandler { if input.isCursorBackward || input.emacsKey == vChewingEmacsKey.backward, input.isShiftHold { var index = state.markerIndex if index > 0 { - index = UInt(state.composingBuffer.utf16PreviousPosition(for: Int(index))) + index = state.composingBuffer.utf16PreviousPosition(for: index) let marking = InputState.Marking( composingBuffer: state.composingBuffer, cursorIndex: state.cursorIndex, @@ -227,7 +227,7 @@ extension KeyHandler { if input.isCursorForward || input.emacsKey == vChewingEmacsKey.forward, input.isShiftHold { var index = state.markerIndex if index < (state.composingBuffer.utf16.count) { - index = UInt(state.composingBuffer.utf16NextPosition(for: Int(index))) + index = state.composingBuffer.utf16NextPosition(for: index) let marking = InputState.Marking( composingBuffer: state.composingBuffer, cursorIndex: state.cursorIndex, @@ -565,11 +565,11 @@ extension KeyHandler { // Shift + Right if currentState.cursorIndex < currentState.composingBuffer.utf16.count { let nextPosition = currentState.composingBuffer.utf16NextPosition( - for: Int(currentState.cursorIndex)) + for: currentState.cursorIndex) let marking: InputState.Marking! = InputState.Marking( composingBuffer: currentState.composingBuffer, cursorIndex: currentState.cursorIndex, - markerIndex: UInt(nextPosition), + markerIndex: nextPosition, readings: currentReadings ) marking.tooltipForInputting = currentState.tooltip @@ -614,11 +614,11 @@ extension KeyHandler { // Shift + left if currentState.cursorIndex > 0 { let previousPosition = currentState.composingBuffer.utf16PreviousPosition( - for: Int(currentState.cursorIndex)) + for: currentState.cursorIndex) let marking: InputState.Marking! = InputState.Marking( composingBuffer: currentState.composingBuffer, cursorIndex: currentState.cursorIndex, - markerIndex: UInt(previousPosition), + markerIndex: previousPosition, readings: currentReadings ) marking.tooltipForInputting = currentState.tooltip diff --git a/Source/Modules/ControllerModules/StringUtils.swift b/Source/Modules/ControllerModules/StringUtils.swift index 4beae553..135f56f5 100644 --- a/Source/Modules/ControllerModules/StringUtils.swift +++ b/Source/Modules/ControllerModules/StringUtils.swift @@ -67,7 +67,7 @@ extension String { (self as NSString).expandingTildeInPath } - public func substring(with nsRange: NSRange) -> String { - (self as NSString).substring(with: nsRange) + public func utf16SubString(with range: NSRange) -> String { + (self as NSString).substring(with: range) } } diff --git a/Source/Modules/IMEModules/ctlInputMethod.swift b/Source/Modules/IMEModules/ctlInputMethod.swift index dd89e5b5..15360103 100644 --- a/Source/Modules/IMEModules/ctlInputMethod.swift +++ b/Source/Modules/IMEModules/ctlInputMethod.swift @@ -373,7 +373,7 @@ extension ctlInputMethod { // the selection range is where the cursor is, with the length being 0 and replacement range NSNotFound, // i.e. the client app needs to take care of where to put this composing buffer client.setMarkedText( - state.attributedString, selectionRange: NSRange(location: Int(state.cursorIndex), length: 0), + state.attributedString, selectionRange: NSRange(location: state.cursorIndex, length: 0), replacementRange: NSRange(location: NSNotFound, length: NSNotFound) ) if !state.tooltip.isEmpty { @@ -395,7 +395,7 @@ extension ctlInputMethod { // the selection range is where the cursor is, with the length being 0 and replacement range NSNotFound, // i.e. the client app needs to take care of where to put this composing buffer client.setMarkedText( - state.attributedString, selectionRange: NSRange(location: Int(state.cursorIndex), length: 0), + state.attributedString, selectionRange: NSRange(location: state.cursorIndex, length: 0), replacementRange: NSRange(location: NSNotFound, length: NSNotFound) ) @@ -420,7 +420,7 @@ extension ctlInputMethod { // the selection range is where the cursor is, with the length being 0 and replacement range NSNotFound, // i.e. the client app needs to take care of where to put this composing buffer client.setMarkedText( - state.attributedString, selectionRange: NSRange(location: Int(state.cursorIndex), length: 0), + state.attributedString, selectionRange: NSRange(location: state.cursorIndex, length: 0), replacementRange: NSRange(location: NSNotFound, length: NSNotFound) ) show(candidateWindowWith: state, client: client) @@ -437,7 +437,7 @@ extension ctlInputMethod { // the selection range is where the cursor is, with the length being 0 and replacement range NSNotFound, // i.e. the client app needs to take care of where to put this composing buffer client.setMarkedText( - state.attributedString, selectionRange: NSRange(location: Int(state.cursorIndex), length: 0), + state.attributedString, selectionRange: NSRange(location: state.cursorIndex, length: 0), replacementRange: NSRange(location: NSNotFound, length: NSNotFound) ) show(candidateWindowWith: state, client: client) @@ -553,7 +553,7 @@ extension ctlInputMethod { var cursor = 0 if let state = state as? InputState.ChoosingCandidate { - cursor = Int(state.cursorIndex) + cursor = state.cursorIndex if cursor == state.composingBuffer.count, cursor != 0 { cursor -= 1 } @@ -581,9 +581,9 @@ extension ctlInputMethod { } } - private func show(tooltip: String, composingBuffer: String, cursorIndex: UInt, client: Any!) { + private func show(tooltip: String, composingBuffer: String, cursorIndex: Int, client: Any!) { var lineHeightRect = NSRect(x: 0.0, y: 0.0, width: 16.0, height: 16.0) - var cursor = Int(cursorIndex) + var cursor = cursorIndex if cursor == composingBuffer.count, cursor != 0 { cursor -= 1 } @@ -615,7 +615,7 @@ extension ctlInputMethod: KeyHandlerDelegate { ) { _ = keyHandler // Stop clang-format from ruining the parameters of this function. if let controller = controller as? ctlCandidate { - ctlCandidate(controller, didSelectCandidateAtIndex: UInt(index)) + ctlCandidate(controller, didSelectCandidateAtIndex: index) } } @@ -651,34 +651,34 @@ extension ctlInputMethod: KeyHandlerDelegate { // MARK: - extension ctlInputMethod: ctlCandidateDelegate { - func candidateCountForController(_ controller: ctlCandidate) -> UInt { + func candidateCountForController(_ controller: ctlCandidate) -> Int { _ = controller // Stop clang-format from ruining the parameters of this function. if let state = state as? InputState.ChoosingCandidate { - return UInt(state.candidates.count) + return state.candidates.count } else if let state = state as? InputState.AssociatedPhrases { - return UInt(state.candidates.count) + return state.candidates.count } return 0 } - func ctlCandidate(_ controller: ctlCandidate, candidateAtIndex index: UInt) + func ctlCandidate(_ controller: ctlCandidate, candidateAtIndex index: Int) -> String { _ = controller // Stop clang-format from ruining the parameters of this function. if let state = state as? InputState.ChoosingCandidate { - return state.candidates[Int(index)] + return state.candidates[index] } else if let state = state as? InputState.AssociatedPhrases { - return state.candidates[Int(index)] + return state.candidates[index] } return "" } - func ctlCandidate(_ controller: ctlCandidate, didSelectCandidateAtIndex index: UInt) { + func ctlCandidate(_ controller: ctlCandidate, didSelectCandidateAtIndex index: Int) { _ = controller // Stop clang-format from ruining the parameters of this function. let client = currentClient if let state = state as? InputState.SymbolTable, - let node = state.node.children?[Int(index)] + let node = state.node.children?[index] { if let children = node.children, !children.isEmpty { handle( @@ -693,7 +693,7 @@ extension ctlInputMethod: ctlCandidateDelegate { } if let state = state as? InputState.ChoosingCandidate { - let selectedValue = state.candidates[Int(index)] + let selectedValue = state.candidates[index] keyHandler.fixNode(value: selectedValue, respectCursorPushing: true) let inputting = keyHandler.buildInputtingState @@ -718,7 +718,7 @@ extension ctlInputMethod: ctlCandidateDelegate { } if let state = state as? InputState.AssociatedPhrases { - let selectedValue = state.candidates[Int(index)] + let selectedValue = state.candidates[index] handle(state: .Committing(poppedText: selectedValue), client: currentClient) if mgrPrefs.associatedPhrasesEnabled, let associatePhrases = keyHandler.buildAssociatePhraseState( diff --git a/Source/UI/CandidateUI/ctlCandidate.swift b/Source/UI/CandidateUI/ctlCandidate.swift index f4333e9c..9fb076f5 100644 --- a/Source/UI/CandidateUI/ctlCandidate.swift +++ b/Source/UI/CandidateUI/ctlCandidate.swift @@ -38,11 +38,11 @@ public class CandidateKeyLabel: NSObject { } public protocol ctlCandidateDelegate: AnyObject { - func candidateCountForController(_ controller: ctlCandidate) -> UInt - func ctlCandidate(_ controller: ctlCandidate, candidateAtIndex index: UInt) + func candidateCountForController(_ controller: ctlCandidate) -> Int + func ctlCandidate(_ controller: ctlCandidate, candidateAtIndex index: Int) -> String func ctlCandidate( - _ controller: ctlCandidate, didSelectCandidateAtIndex index: UInt + _ controller: ctlCandidate, didSelectCandidateAtIndex index: Int ) } @@ -53,7 +53,7 @@ public class ctlCandidate: NSWindowController { } } - public var selectedCandidateIndex: UInt = .max + public var selectedCandidateIndex: Int = .max public var visible: Bool = false { didSet { NSObject.cancelPreviousPerformRequests(withTarget: self) @@ -108,8 +108,8 @@ public class ctlCandidate: NSWindowController { false } - public func candidateIndexAtKeyLabelIndex(_: UInt) -> UInt { - UInt.max + public func candidateIndexAtKeyLabelIndex(_: Int) -> Int { + Int.max } /// Sets the location of the candidate window. diff --git a/Source/UI/CandidateUI/ctlCandidateHorizontal.swift b/Source/UI/CandidateUI/ctlCandidateHorizontal.swift index 17245e60..2e7ab7a7 100644 --- a/Source/UI/CandidateUI/ctlCandidateHorizontal.swift +++ b/Source/UI/CandidateUI/ctlCandidateHorizontal.swift @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import Cocoa private class HorizontalCandidateView: NSView { - var highlightedIndex: UInt = 0 + var highlightedIndex: Int = 0 { didSet { highlightedIndex = max(highlightedIndex, 0) } } var action: Selector? weak var target: AnyObject? @@ -42,7 +42,9 @@ private class HorizontalCandidateView: NSView { private var candidateAttrDict: [NSAttributedString.Key: AnyObject] = [:] private var candidateWithLabelAttrDict: [NSAttributedString.Key: AnyObject] = [:] private var elementWidths: [CGFloat] = [] - private var trackingHighlightedIndex: UInt = .max + private var trackingHighlightedIndex: Int = .max { + didSet { trackingHighlightedIndex = max(trackingHighlightedIndex, 0) } + } override var isFlipped: Bool { true @@ -196,26 +198,27 @@ private class HorizontalCandidateView: NSView { } } - private func findHitIndex(event: NSEvent) -> UInt? { + private func findHitIndex(event: NSEvent) -> Int { let location = convert(event.locationInWindow, to: nil) if !bounds.contains(location) { - return nil + return NSNotFound } var accuWidth: CGFloat = 0.0 for (index, elementWidth) in elementWidths.enumerated() { let currentWidth = elementWidth if location.x >= accuWidth, location.x <= accuWidth + currentWidth { - return UInt(index) + return index } accuWidth += currentWidth + 1.0 } - return nil + return NSNotFound } override func mouseUp(with event: NSEvent) { trackingHighlightedIndex = highlightedIndex - guard let newIndex = findHitIndex(event: event) else { + let newIndex = findHitIndex(event: event) + guard newIndex != NSNotFound else { return } highlightedIndex = newIndex @@ -223,7 +226,8 @@ private class HorizontalCandidateView: NSView { } override func mouseDown(with event: NSEvent) { - guard let newIndex = findHitIndex(event: event) else { + let newIndex = findHitIndex(event: event) + guard newIndex != NSNotFound else { return } var triggerAction = false @@ -247,7 +251,7 @@ public class ctlCandidateHorizontal: ctlCandidate { private var candidateView: HorizontalCandidateView private var prevPageButton: NSButton private var nextPageButton: NSButton - private var currentPageIndex: UInt = 0 + private var currentPageIndex: Int = 0 public init() { var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0) @@ -364,24 +368,24 @@ public class ctlCandidateHorizontal: ctlCandidate { return true } - override public func candidateIndexAtKeyLabelIndex(_ index: UInt) -> UInt { + override public func candidateIndexAtKeyLabelIndex(_ index: Int) -> Int { guard let delegate = delegate else { - return UInt.max + return Int.max } - let result = currentPageIndex * UInt(keyLabels.count) + index - return result < delegate.candidateCountForController(self) ? result : UInt.max + let result = currentPageIndex * keyLabels.count + index + return result < delegate.candidateCountForController(self) ? result : Int.max } - override public var selectedCandidateIndex: UInt { + override public var selectedCandidateIndex: Int { get { - currentPageIndex * UInt(keyLabels.count) + candidateView.highlightedIndex + currentPageIndex * keyLabels.count + candidateView.highlightedIndex } set { guard let delegate = delegate else { return } - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count if newValue < delegate.candidateCountForController(self) { currentPageIndex = newValue / keyLabelCount candidateView.highlightedIndex = newValue % keyLabelCount @@ -392,12 +396,12 @@ public class ctlCandidateHorizontal: ctlCandidate { } extension ctlCandidateHorizontal { - private var pageCount: UInt { + private var pageCount: Int { guard let delegate = delegate else { return 0 } let totalCount = delegate.candidateCountForController(self) - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count return totalCount / keyLabelCount + ((totalCount % keyLabelCount) != 0 ? 1 : 0) } @@ -409,7 +413,7 @@ extension ctlCandidateHorizontal { candidateView.set(keyLabelFont: keyLabelFont, candidateFont: candidateFont) var candidates = [String]() let count = delegate.candidateCountForController(self) - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count let begin = currentPageIndex * keyLabelCount for index in begin.. UInt? { + private func findHitIndex(event: NSEvent) -> Int { let location = convert(event.locationInWindow, to: nil) if !bounds.contains(location) { - return nil + return NSNotFound } var accuHeight: CGFloat = 0.0 for (index, elementHeight) in elementHeights.enumerated() { let currentHeight = elementHeight if location.y >= accuHeight, location.y <= accuHeight + currentHeight { - return UInt(index) + return index } accuHeight += currentHeight } - return nil + return NSNotFound } override func mouseUp(with event: NSEvent) { trackingHighlightedIndex = highlightedIndex - guard let newIndex = findHitIndex(event: event) else { + let newIndex = findHitIndex(event: event) + guard newIndex != NSNotFound else { return } highlightedIndex = newIndex @@ -228,7 +231,8 @@ private class VerticalCandidateView: NSView { } override func mouseDown(with event: NSEvent) { - guard let newIndex = findHitIndex(event: event) else { + let newIndex = findHitIndex(event: event) + guard newIndex != NSNotFound else { return } var triggerAction = false @@ -252,7 +256,7 @@ public class ctlCandidateVertical: ctlCandidate { private var candidateView: VerticalCandidateView private var prevPageButton: NSButton private var nextPageButton: NSButton - private var currentPageIndex: UInt = 0 + private var currentPageIndex: Int = 0 public init() { var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0) @@ -369,24 +373,24 @@ public class ctlCandidateVertical: ctlCandidate { return true } - override public func candidateIndexAtKeyLabelIndex(_ index: UInt) -> UInt { + override public func candidateIndexAtKeyLabelIndex(_ index: Int) -> Int { guard let delegate = delegate else { - return UInt.max + return Int.max } - let result = currentPageIndex * UInt(keyLabels.count) + index - return result < delegate.candidateCountForController(self) ? result : UInt.max + let result = currentPageIndex * keyLabels.count + index + return result < delegate.candidateCountForController(self) ? result : Int.max } - override public var selectedCandidateIndex: UInt { + override public var selectedCandidateIndex: Int { get { - currentPageIndex * UInt(keyLabels.count) + candidateView.highlightedIndex + currentPageIndex * keyLabels.count + candidateView.highlightedIndex } set { guard let delegate = delegate else { return } - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count if newValue < delegate.candidateCountForController(self) { currentPageIndex = newValue / keyLabelCount candidateView.highlightedIndex = newValue % keyLabelCount @@ -397,12 +401,12 @@ public class ctlCandidateVertical: ctlCandidate { } extension ctlCandidateVertical { - private var pageCount: UInt { + private var pageCount: Int { guard let delegate = delegate else { return 0 } let totalCount = delegate.candidateCountForController(self) - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count return totalCount / keyLabelCount + ((totalCount % keyLabelCount) != 0 ? 1 : 0) } @@ -414,7 +418,7 @@ extension ctlCandidateVertical { candidateView.set(keyLabelFont: keyLabelFont, candidateFont: candidateFont) var candidates = [String]() let count = delegate.candidateCountForController(self) - let keyLabelCount = UInt(keyLabels.count) + let keyLabelCount = keyLabels.count let begin = currentPageIndex * keyLabelCount for index in begin..