Π£ ΠΌΠ΅Π½Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΌΠ°ΡΠΊΠΈ:
self.login.affineFormats = [
"{+7} ([000]) [000] [00] [00]",
"{8} ([000]) [000]-[00]-[00]"
]
ΠΠΎΠ³Π΄Π° Ρ Π½Π°Π±ΠΈΡΠ°Ρ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Ρ ΠΌΠ°ΡΠΊΠΎΠΉ +7, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ([000]), ΠΌΠ°ΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° 8 Π²ΠΌΠ΅ΡΡΠΎ +7, Π° Π·Π°ΡΠ΅ΠΌ Π²Π½ΡΡΡΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ 7 ([000])
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ± Β«Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΒ» ΠΌΠ°ΡΠΊΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»Π΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Π±ΡΠ»Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΠΌΠ°ΡΠΎΠΊ?
ΠΡΠΈΠ²Π΅Ρ @MrJox , ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°Ρ ΠΎΡΡΠ΅Ρ.
ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ° Π²Π½ΡΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°?
Π― ΡΠΌΠΎΠ³Ρ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ ΡΠ΅Π³ΠΎΠ΄Π½Ρ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π²Ρ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΠ΅ ΠΏΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΠΌΠΈ, Π½ΠΎ Π²ΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ:
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π°, ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠΉ ΠΈΠ· ΠΊΠ΅ΡΠ° ΠΈ Π²ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ (ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ JVFloat).
ΠΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° +7 (926) 000-00-00 ΠΈ ΡΠΎΠ³Π΄Π° Ρ ΡΡΠ°Π²Π»Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΏΠΎΡΠ»Π΅ '2' ΠΈ ΡΠ΄Π°Π»ΡΡ ΡΡΠΎΡ Π½ΠΎΠΌΠ΅Ρ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΠΎΠΉ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² 8 (796) 000-00-00.
ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΎΠ½ ΡΠ΄Π°Π»ΡΠ΅Ρ + ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ 7 Π½Π΅ ΠΊΠ°ΠΊ ΠΌΠ°ΡΠΊΡ, Π° ΠΊΠ°ΠΊ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ°ΡΡΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π»Π΅ΡΠΎΠ½Π°, ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π² ΡΠΊΠΎΠ±ΠΊΠΈ, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΌΠ°ΡΠΊΡ 8.
ΠΠ°, Π²Π°ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ!
ΠΡΡΡ Π² ΠΊΡΡΡΠ΅.
@MrJox , ΠΏΠΎΠΊΠ° Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π°Π΄ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Ρ ΡΠΎΠ±ΡΠ°Π» Π±ΡΡΡΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ PolyMaskTextFieldDelegate
Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΠ°ΡΡΠ΅ΡΠ° ΡΡ
ΠΎΠ΄ΡΡΠ²Π°. ΠΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΡ
ΠΎΠ΄ΡΡΠ²Π° ΡΠ΅ΠΊΡΡΠ° Ρ ΠΌΠ°ΡΠΊΠΎΠΉ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π΄Π»ΠΈΠ½Ρ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠ², ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
import Foundation
import UIKit
import InputMask
<strong i="10">@IBDesignable</strong>
class PrefixAffinityMaskedTextFieldDelegate: MaskedTextFieldDelegate {
public var affineFormats: [String]
public init(primaryFormat: String, affineFormats: [String]) {
self.affineFormats = affineFormats
super.init(format: primaryFormat)
}
public override init(format: String) {
self.affineFormats = []
super.init(format: format)
}
override open func put(text: String, into field: UITextField) {
let mask: Mask = pickMask(
forText: text,
caretPosition: text.endIndex,
autocomplete: autocomplete
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.endIndex
),
autocomplete: autocomplete
)
field.text = result.formattedText.string
field.caretPosition = result.formattedText.string.distance(
from: result.formattedText.string.startIndex,
to: result.formattedText.caretPosition
)
listener?.textField?(field, didFillMandatoryCharacters: result.complete, didExtractValue: result.extractedValue)
}
override open func deleteText(inRange range: NSRange, inTextInput field: UITextInput) -> Mask.Result {
let text: String = replaceCharacters(
inText: field.allText,
range: range,
withCharacters: ""
)
let mask: Mask = pickMask(
forText: text,
caretPosition: text.index(text.startIndex, offsetBy: range.location),
autocomplete: false
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.index(text.startIndex, offsetBy: range.location)
),
autocomplete: false
)
field.allText = result.formattedText.string
field.caretPosition = range.location
return result
}
override open func modifyText(
inRange range: NSRange,
inTextInput field: UITextInput,
withText text: String
) -> Mask.Result {
let updatedText: String = replaceCharacters(
inText: field.allText,
range: range,
withCharacters: text
)
let mask: Mask = pickMask(
forText: updatedText,
caretPosition: updatedText.index(updatedText.startIndex, offsetBy: field.caretPosition + text.count),
autocomplete: autocomplete
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: updatedText,
caretPosition: updatedText.index(updatedText.startIndex, offsetBy: field.caretPosition + text.count)
),
autocomplete: autocomplete
)
field.allText = result.formattedText.string
field.caretPosition = result.formattedText.string.distance(
from: result.formattedText.string.startIndex,
to: result.formattedText.caretPosition
)
return result
}
func pickMask(forText text: String, caretPosition: String.Index, autocomplete: Bool) -> Mask {
let primaryAffinity: Int = calculateAffinity(
ofMask: mask,
forText: text,
caretPosition: caretPosition,
autocomplete: autocomplete
)
var masks: [(Mask, Int)] = affineFormats.map { (affineFormat: String) -> (Mask, Int) in
let mask: Mask = try! Mask.getOrCreate(withFormat: affineFormat, customNotations: customNotations)
let affinity: Int = calculateAffinity(
ofMask: mask,
forText: text,
caretPosition: caretPosition,
autocomplete: autocomplete
)
return (mask, affinity)
}
masks.sort { (left: (Mask, Int), right: (Mask, Int)) -> Bool in
return left.1 > right.1
}
var insertIndex: Int = -1
for (index, maskAffinity) in masks.enumerated() {
if primaryAffinity >= maskAffinity.1 {
insertIndex = index
break
}
}
if (insertIndex >= 0) {
masks.insert((mask, primaryAffinity), at: insertIndex)
} else {
masks.append((mask, primaryAffinity))
}
return masks.first!.0
}
func calculateAffinity(
ofMask mask: Mask,
forText text: String,
caretPosition: String.Index,
autocomplete: Bool
) -> Int {
return mask.apply(
toText: CaretString(
string: text,
caretPosition: caretPosition
),
autocomplete: autocomplete
).formattedText.string.prefixIntersection(with: text).count
}
func replaceCharacters(inText text: String, range: NSRange, withCharacters newText: String) -> String {
if 0 < range.length {
let result = NSMutableString(string: text)
result.replaceCharacters(in: range, with: newText)
return result as String
} else {
let result = NSMutableString(string: text)
result.insert(newText, at: range.location)
return result as String
}
}
}
extension String {
func prefixIntersection(with string: String) -> Substring {
let lhsStartIndex = startIndex
var lhsEndIndex = startIndex
let rhsStartIndex = string.startIndex
var rhsEndIndex = string.startIndex
while (self[lhsStartIndex...lhsEndIndex] == string[rhsStartIndex...rhsEndIndex]) {
lhsEndIndex = lhsEndIndex != endIndex ? index(after: lhsEndIndex) : endIndex
rhsEndIndex = rhsEndIndex != string.endIndex ? string.index(after: rhsEndIndex) : endIndex
if (lhsEndIndex == endIndex || rhsEndIndex == string.endIndex) {
return self[lhsStartIndex..<lhsEndIndex]
}
}
return self[lhsStartIndex..<lhsEndIndex]
}
}
extension UITextInput {
var allText: String {
get {
guard let all: UITextRange = allTextRange
else { return "" }
return self.text(in: all) ?? ""
}
set(newText) {
guard let all: UITextRange = allTextRange
else { return }
self.replace(all, withText: newText)
}
}
var caretPosition: Int {
get {
if let responder = self as? UIResponder {
// Workaround for non-optional `beginningOfDocument`, which could actually be nil if field doesn't have focus
guard responder.isFirstResponder
else { return allText.count }
}
if let range: UITextRange = selectedTextRange {
let selectedTextLocation: UITextPosition = range.start
return offset(from: beginningOfDocument, to: selectedTextLocation)
} else {
return 0
}
}
set(newPosition) {
if let responder = self as? UIResponder {
// Workaround for non-optional `beginningOfDocument`, which could actually be nil if field doesn't have focus
guard responder.isFirstResponder
else { return }
}
if newPosition > allText.count {
return
}
let from: UITextPosition = position(from: beginningOfDocument, offset: newPosition)!
let to: UITextPosition = position(from: from, offset: 0)!
selectedTextRange = textRange(from: from, to: to)
}
}
var allTextRange: UITextRange? {
return self.textRange(from: self.beginningOfDocument, to: self.endOfDocument)
}
}
Π₯ΠΌ, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π΄Π΅Π»Π°Ρ ΡΡΠΎ:
<strong i="6">@IBOutlet</strong> var loginListener: PrefixAffinityMaskedTextFieldDelegate!
ΠΠΎ ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π§ΡΠΎ Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ», Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΄Π°Π»ΡΠ΅ΡΠ΅ ΡΠΈΡΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ Del, ΡΠΈΡΡΠ° ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ Π½Π° ΠΎΠ΄Π½Ρ ΡΠΈΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΡΠ΄Π°Π»ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Backspace, ΠΎΠ½Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ/ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ Π»ΠΈΠ±ΠΎ ΡΠΈΡΡΡ ΡΠ»Π΅Π²Π°, Π»ΠΈΠ±ΠΎ ΡΠΈΡΡΡ ΡΠΏΡΠ°Π²Π°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΡ Π²Π½ΡΡΡΠΈ ΡΠΊΠΎΠ±ΠΎΠΊ ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ.
Π§ΡΠΎ Ρ ΠΈΠΌΠ΅Ρ Π² Π²ΠΈΠ΄Ρ:
ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»: +7 (916) 000-00-00
Ρ ΠΊΠ»ΡΡΠΎΠΌ del: +7 (96) 000-00-00
Ρ ΠΊΠ»Π°Π²ΠΈΡΠ΅ΠΉ Backspace: 8 (796) 000-00-00
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅:
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΡΠΎΠΊΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»Π΅, Ρ ΠΌΠ΅Π½Ρ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ» Β«+Β», Π° Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ»Π΅ΡΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΡΠ΄Π°Π»ΠΈΡΡ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
Π’Π΅ΠΌΠ° 1: ΠΠ΅ΡΡΡΡΠ°Π½ΠΈΠΌΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ endIndex
@MrJox Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ΅Π±Ρ ΠΏΠΎΠ½ΡΠ».
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½Π° iOS Π½Π΅Ρ ΠΊΠ»ΡΡΠ° Del
, ΡΠΎΠ»ΡΠΊΠΎ Backspace
. ΠΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠΉΡΠ΅ ΡΠΌΡΠ»ΡΡΠΈΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΎΠ±ΠΌΠ°Π½ΡΡΡ Π²Π°Ρ.
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ Π²Π°ΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΡΡ Π΄Π»Ρ ΠΊΡΠ°ΠΉΠ½Π΅Π³ΠΎ ΡΠ»ΡΡΠ°Ρ:
extension String {
func prefixIntersection(with string: String) -> Substring {
guard !self.isEmpty && !string.isEmpty
else { return "" }
let lhsStartIndex = startIndex
var lhsEndIndex = startIndex
let rhsStartIndex = string.startIndex
var rhsEndIndex = string.startIndex
while (self[lhsStartIndex...lhsEndIndex] == string[rhsStartIndex...rhsEndIndex]) {
lhsEndIndex = lhsEndIndex != endIndex ? index(after: lhsEndIndex) : endIndex
rhsEndIndex = rhsEndIndex != string.endIndex ? string.index(after: rhsEndIndex) : endIndex
if (lhsEndIndex == endIndex || rhsEndIndex == string.endIndex) {
return self[lhsStartIndex..<lhsEndIndex]
}
}
return self[lhsStartIndex..<lhsEndIndex]
}
}
ΠΠ°, ΠΈΡΠΏΡΠ°Π²ΠΈΠ», ΡΠΏΠ°ΡΠΈΠ±ΠΎ!
@MrJox Π― Π·Π°ΠΊΡΠΎΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π― ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ.
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΈ ΡΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ @MrJox :
extension String {
func prefixIntersection(with string: String) -> Substring {
var lhsIndex = startIndex
var rhsIndex = string.startIndex
while lhsIndex != endIndex && rhsIndex != string.endIndex {
if self[...lhsIndex] == string[...rhsIndex] {
lhsIndex = index(after: lhsIndex)
rhsIndex = string.index(after: rhsIndex)
} else {
return self[..<lhsIndex]
}
}
return self[..<lhsIndex]
}
}
4.0.0
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠ°, ΠΈΡΠΏΡΠ°Π²ΠΈΠ», ΡΠΏΠ°ΡΠΈΠ±ΠΎ!