From 095c432a6136f49da59fde29a22e5354a5214d6f Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Thu, 9 Nov 2017 17:35:48 +0800 Subject: [PATCH 1/2] Fix MessageLabel address detection --- Sources/Views/MessageLabel.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/Views/MessageLabel.swift b/Sources/Views/MessageLabel.swift index 2d48ab12..0bd02762 100644 --- a/Sources/Views/MessageLabel.swift +++ b/Sources/Views/MessageLabel.swift @@ -432,8 +432,12 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { switch detectorType { case .address: - guard let addressComponents = value as? [String: String] else { return } - handleAddress(addressComponents) + var transformedAddressComponents = [String: String]() + guard let addressComponents = value as? [NSTextCheckingKey: String] else { return } + addressComponents.forEach { (key, value) in + transformedAddressComponents[key.rawValue] = value + } + handleAddress(transformedAddressComponents) case .phoneNumber: guard let phoneNumber = value as? String else { return } handlePhoneNumber(phoneNumber) From e61b09e6826dfb6ad34143f7e7553c3dae6ec237 Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Thu, 9 Nov 2017 21:46:50 +0800 Subject: [PATCH 2/2] refactor MessageLabel --- Sources/Views/MessageLabel.swift | 55 ++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/Sources/Views/MessageLabel.swift b/Sources/Views/MessageLabel.swift index 0bd02762..37cc5b0a 100644 --- a/Sources/Views/MessageLabel.swift +++ b/Sources/Views/MessageLabel.swift @@ -49,7 +49,7 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { return textStorage }() - private lazy var rangesForDetectors: [DetectorType: [(NSRange, Any?)]] = [:] + private lazy var rangesForDetectors: [DetectorType: [(NSRange, MessageTextCheckingType)]] = [:] // MARK: - Public Properties @@ -321,13 +321,13 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { private func detectorAttributes(for checkingResultType: NSTextCheckingResult.CheckingType) -> [NSAttributedStringKey: Any] { switch checkingResultType { - case NSTextCheckingResult.CheckingType.address: + case .address: return addressAttributes - case NSTextCheckingResult.CheckingType.date: + case .date: return dateAttributes - case NSTextCheckingResult.CheckingType.phoneNumber: + case .phoneNumber: return phoneNumberAttributes - case NSTextCheckingResult.CheckingType.link: + case .link: return urlAttributes default: fatalError("Received an unrecognized NSTextCheckingResult.CheckingType") @@ -349,24 +349,24 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { for result in checkingResults { switch result.resultType { - case NSTextCheckingResult.CheckingType.address: + case .address: var ranges = rangesForDetectors[.address] ?? [] - let tuple = (result.range, result.addressComponents) as (NSRange, Any?) + let tuple: (NSRange, MessageTextCheckingType) = (result.range, .addressComponents(result.addressComponents)) ranges.append(tuple) rangesForDetectors.updateValue(ranges, forKey: .address) - case NSTextCheckingResult.CheckingType.date: + case .date: var ranges = rangesForDetectors[.date] ?? [] - let tuple = (result.range, result.date) as (NSRange, Any?) + let tuple: (NSRange, MessageTextCheckingType) = (result.range, .date(result.date)) ranges.append(tuple) rangesForDetectors.updateValue(ranges, forKey: .date) - case NSTextCheckingResult.CheckingType.phoneNumber: + case .phoneNumber: var ranges = rangesForDetectors[.phoneNumber] ?? [] - let tuple = (result.range, result.phoneNumber) as (NSRange, Any?) + let tuple: (NSRange, MessageTextCheckingType) = (result.range, .phoneNumber(result.phoneNumber)) ranges.append(tuple) rangesForDetectors.updateValue(ranges, forKey: .phoneNumber) - case NSTextCheckingResult.CheckingType.link: + case .link: var ranges = rangesForDetectors[.url] ?? [] - let tuple = (result.range, result.url) as (NSRange, Any?) + let tuple: (NSRange, MessageTextCheckingType) = (result.range, .link(result.url)) ranges.append(tuple) rangesForDetectors.updateValue(ranges, forKey: .url) default: @@ -428,24 +428,24 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { } } - private func handleGesture(for detectorType: DetectorType, value: Any?) { - - switch detectorType { - case .address: + private func handleGesture(for detectorType: DetectorType, value: MessageTextCheckingType) { + + switch value { + case let .addressComponents(addressComponents): var transformedAddressComponents = [String: String]() - guard let addressComponents = value as? [NSTextCheckingKey: String] else { return } + guard let addressComponents = addressComponents else { return } addressComponents.forEach { (key, value) in transformedAddressComponents[key.rawValue] = value } handleAddress(transformedAddressComponents) - case .phoneNumber: - guard let phoneNumber = value as? String else { return } + case let .phoneNumber(phoneNumber): + guard let phoneNumber = phoneNumber else { return } handlePhoneNumber(phoneNumber) - case .date: - guard let date = value as? Date else { return } + case let .date(date): + guard let date = date else { return } handleDate(date) - case .url: - guard let url = value as? URL else { return } + case let .link(url): + guard let url = url else { return } handleURL(url) } } @@ -467,3 +467,10 @@ open class MessageLabel: UILabel, UIGestureRecognizerDelegate { } } + +fileprivate enum MessageTextCheckingType { + case addressComponents([NSTextCheckingKey: String]?) + case date(Date?) + case phoneNumber(String?) + case link(URL?) +}