Input-mask-ios: ๊ณต๋ฐฑ ๋ฌธ์ œ

์— ๋งŒ๋“  2018๋…„ 05์›” 24์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: RedMadRobot/input-mask-ios

๋‚˜๋Š” ๊ณต๋ฐฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. "[0000] [0000] [0000] [0000] [999]" ์‹ ์šฉ ์นด๋“œ์šฉ ๋งˆ์Šคํฌ๊ฐ€ ์žˆ์ง€๋งŒ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์ˆ˜ ์ˆซ์ž ์ž…๋ ฅ์„ ๋งˆ์น˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ [999] ์ „์— ๊ณต๋ฐฑ์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ‘œ์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  2. ์ด๋ฆ„ ์ž…๋ ฅ์„ ์œ„ํ•œ ์ด ๋งˆ์Šคํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: [Aโ€ฆ] ํ•˜์ง€๋งŒ ๊ณต๋ฐฑ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ๊ธฐํ˜ธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์— ๋Œ€ํ•œ ๋งž์ถค ํ‘œ๊ธฐ๋ฒ•์„ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฌธ์ž์™€ ์„ ํƒ์  ๊ณต๋ฐฑ์„ ์–ด๋–ป๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ด ๋ฉ‹์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

feature request question

๋ชจ๋“  6 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @caioremedio์ž…๋‹ˆ๋‹ค!
์งˆ๋ฌธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์ธ ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € "[0000] [0000] [0000] [0000] [999]" ์‹ ์šฉ ์นด๋“œ ๋งˆ์Šคํฌ ๋งž์ถค ํ‘œ๊ธฐ๋ฒ•์ด ๋‹ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒ์  ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

"[0000] [0000] [0000] [0000][s][999]"

Notation(character: "s", characterSet: CharacterSet(charactersIn: " "), isOptional: true)

- ์‹œ๋„ํ•ด๋ณด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‘˜์งธ , Compiler ์—์„œ ๋…ผ๋ฆฌ์  ๊ฒฐํ•จ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด์ „ ๋ฌธ์ž์— ๋”ฐ๋ผ [โ€ฆ] ํŠน์„ฑ์„ ์ƒ์†ํ•˜๋ ค๊ณ  ํ•˜๋ฉฐ ์ด ์ด์ „ ๋ฌธ์ž์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ• ์„

ํ•„์š”์— ๋”ฐ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ฒ ์ฃ ?

์•ˆ๋…•ํ•˜์„ธ์š” @taflanidi๋‹˜ , ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ: [s] ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€์˜ ์„œ๋ธŒ ํด๋ž˜์Šค ์‚ฌ์šฉํ•˜๊ณ  MaskedTextFieldDelegate , ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ • inits ์ƒ์„ฑ customNotations :

class NotifyingMaskedTextFieldDelegate: MaskedTextFieldDelegate {

    weak var editingListener: NotifyingMaskedTextFieldDelegateListener?

    override init(format: String) {
        super.init(format: format)
    }

    convenience init(format: String, customNotations: [Notation]) {
        self.init(format: format)
        self.customNotations = customNotations
    }

    convenience init(format: String, customNotation: Notation) {
        self.init(format: format, customNotations: [customNotation])
    }
}

์ดˆ๊ธฐํ™” ์ค‘:

NotifyingMaskedTextFieldDelegate(
    format: "[0000] [0000] [0000] [0000][s][999]",
    customNotation: Notation(character: "s",
                             characterSet: CharacterSet(charactersIn: " "),
                             isOptional: true))

๋‘ ๋ฒˆ์งธ: ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ณต๋ฐฑ๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ˆซ์ž ๋ฐ ๋ฌธ์ž ํฌํ•จ)?

๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @caioremedio ,

[]๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„, ์žŠ์–ด๋ฒ„๋ ธ๋„ค์š”. ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ• ์ถ”๊ฐ€ ์ •๋ณด ์„น์…˜์˜ ๋์—์„œ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

MaskedTextFieldDelegate์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ customNotations์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ •์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. MaskedTextFieldDelegate ์—๋Š” ํ•ด๋‹น ๊ณต์šฉ ๋ณ€์ˆ˜ customNotations ๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ํ‘œ๊ธฐ๋ฒ• ๋ชฉ๋ก์„ ํ• ๋‹นํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ด์ œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”์ถœ๋œ ๊ฐ’์— ๋Œ€ํ•ด ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋Š” 1234123412341234 999 โ€” ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์น˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. Mask ์ธ์Šคํ„ด์Šค ๋ฐ ๋ž˜ํผ MaskedTextFieldDelegate ๋Š” acceptableTextLength , totalTextLength ๋“ฑ๊ณผ ๊ฐ™์ด ํ…์ŠคํŠธ ๋ฐ ์ถ”์ถœ๋œ ๊ฐ’์— ๋Œ€ํ•ด ์ผ๋ จ์˜ ๊ณ„์‚ฐ๋œ ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

MaskedTextFieldDelegate.acceptableValueLength() ๋Š” ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ 16 ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ถ”์ถœ๋œ ๊ฐ’์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž…๋ ฅ์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  1. > ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ณต๋ฐฑ๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ˆซ์ž์™€ ๋ฌธ์ž์™€ ํ•จ๊ป˜)?

๋™์ž‘์„ ์ •์˜ํ•˜๋ ค๋ฉด Compiler ์„ ํ–‰ ๋ฌธ์ž์˜ ํŠน์„ฑ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Aโ€ฆ]
 ^ this one defines, what symbols are accepted

ํ˜„์žฌ Compiler ๋Š” A a 0 9 - _ ์˜ ๊ธฐ๋ณธ ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํƒ€์›ํ˜• ๋งˆ์Šคํฌ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์•„, ์žŠ์–ด๋ฒ„๋ ธ๋„ค์š”. ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ• ์ถ”๊ฐ€ ์ •๋ณด ์„น์…˜์˜ ๋์—์„œ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ง™์†Œ์‚ฌ, ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ์–ด์š”.

์‹ค์ œ๋กœ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. MaskedTextFieldDelegate์—๋Š” ํ•ด๋‹น ๊ณต์šฉ ๋ณ€์ˆ˜ customNotations๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ํ‘œ๊ธฐ๋ฒ• ๋ชฉ๋ก์„ ํ• ๋‹นํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•์„ ์œ„ํ•ด ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹( UITextField ๋ฉ”์„œ๋“œ ์žฌ์ •์˜)์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž๋™ ์™„์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ผ์Šต๋‹ˆ๋‹ค.

MaskedTextFieldDelegate.acceptableValueLength()๋Š” ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ 16์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ž…๋ ฅ์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ถœ๋œ ๊ฐ’์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ completed == true ๋ฅผ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ์ด์ œ value.count > MaskedTextFieldDelegate.acceptableValueLength() ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํƒ€์›ํ˜• ๋งˆ์Šคํฌ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์žก์•˜๋‹ค. ๊ทธ๋™์•ˆ ๊ธฐ๋ณธ UITextFieldDelegate ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌธ์ž ์•ž์˜ ์ค„์ž„ํ‘œ์˜ ํŠน์„ฑ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„, ์ƒ๋žต ๋ถ€ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•(์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@caioremedio ,

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์‹  ์™„๋ฃŒ == true์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ด์ œ value.count > MaskedTextFieldDelegate.acceptableValueLength() ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

๋„ค.

์•„, ์ƒ๋žต ๋ถ€ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•(์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ ์ธก์—์„œ ๋” ์ ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์žก์•˜๋‹ค. ๊ทธ๋™์•ˆ ๊ธฐ๋ณธ UITextFieldDelegate๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฃผ๋ง Compiler ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋Œ€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

@caioremedio ,

์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ œ ํƒ€์›ํ˜• ๋งˆ์Šคํฌ๋„ ์‚ฌ์šฉ์ž ์ง€์ • ํ‘œ๊ธฐ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์‹  3.4.1 .

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰