2014-11-05 7 views
4

Я импортирую номер телефона из «Контакты» и сохраняю в NSString. эта строка содержит пробельные, и я стараюсь, чтобы удалить их с помощью метода:строка заменить номер телефона iOS swift

numero = numero.stringByReplacingOccurrencesOfString(" ", withString: "") 

этот метод не работает.


func sostituisci(stringa: NSString!) -> NSString  
{   
var numero: NSString = ""   
NSLog(stringa) 
numero = ((stringa as String).stringByReplacingOccurrencesOfString(" ", withString: "") as NSString) 
NSLog(numero) 

return numero 
} 

выход без изменений


журнал

2014-11-05 17:54:50.734 HappyRicarica[33438:3119446] (327) 124-3503 
2014-11-05 17:54:50.737 HappyRicarica[33438:3119446] (327) 124-3503 
+1

Для записи типа Фонда отличаются от типов Свифта. «Строка» в Swift не является «NSString» –

+0

Что происходит, когда «это не работает?» Является ли строка неизменной? Вы получили сообщение об ошибке? Это сработало для меня с 'numero', объявленным как' String' или 'NSString'. Объявляется 'numero' с' var' или 'let'? – vacawama

+0

строка неизменной. – dario91sr

ответ

4

Я подозреваю, что символ пробела в строке на самом деле не пространство. Попробуйте добавить это после того, как NSLog(string) видеть, что значения скалярных Юникода для символов в строке:

for uni in (stringa as String).unicodeScalars { 
    println("\(uni) = \(uni.value)") 
} 

Ожидаемый результат для «(327) 124-3503» является:

(= 40 
3 = 51 
2 = 50 
7 = 55 
) = 41 
    = 32 
1 = 49 
2 = 50 
4 = 52 
- = 45 
3 = 51 
5 = 53 
0 = 48 
3 = 51 

От Вашего комментарий, ваше пространство имеет значение 160 вместо 32. Можно удалить, что с:

numero = stringa.stringByReplacingOccurrencesOfString(String(Character(UnicodeScalar(160))), withString: "") 
+0

журнале, когда я использую свой метод: HappyRicarica [33497: 3132714] (327) 124-3503 (= 40 3 = 51 2 = 50 7 = 55 ) = 41 = 160 1 = 49 2 = 50 4 = 52 - = 45 3 = 51 5 = 53 0 = 48 3 = 51 – dario91sr

+0

Я знаю, что aleady принял ответ. Я просто хотел, чтобы вы знали, почему ваш исходный код не работает. Ваше пространство было не просто пространством (ASCII 32), но оно имело значение 160 вместо этого. См. Обновление выше, как его заменить. Ответ, который вы приняли, действительно хорош, поэтому я оставил бы это как принятый ответ. – vacawama

0

вы попробуйте:

let str = "XX XX XX XX XX" 
    let separated = str.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
    let finalStr = "".join(separated) 
+0

ошибка в строке: let finalStr =" ".join (разделенный) -> «Строка» не идентична «AnyObject» – dario91sr

+1

, если вы замените 'let finalStr =" ".join (отделен)' с 'let finalStr = (" "как String) .join (отделен)'? –

0

NSString не String, так что вы должны использовать:

numero = ((numero as String).stringByReplacingOccurrencesOfString(" ", withString: "") as NSString) 
+0

Я пытался, но не работает – dario91sr

2

обновление: Xcode 7.2 • Swift 2.1.1

extension String { 
    var numbersOnly: String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890") 
      .invertedSet) 
      .joinWithSeparator("") 
    } 
    var numbersExempt: String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890")) 
      .joinWithSeparator("") 
    } 
    var charactersOnly: String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet).joinWithSeparator("") 
    } 
    var charactersExempt: String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")).joinWithSeparator("") 
    } 
    func keep(keepIt: String) -> String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: keepIt).invertedSet).joinWithSeparator("") 
    } 
    func exclude(excludeIt: String) -> String { 
     return componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: excludeIt)).joinWithSeparator("") 
    } 
} 

let phoneNumber = "+1 (555) 555 - 5555".numbersOnly 
print(phoneNumber) // "15555555555" 

let excludePlusMinus = "+1 (555) 555-5555".exclude("+-") // "1 (555) 5555555" 
let keepWhatever = "+1 (555) 555-5555".keep("()-+") // "+()-" 

Вы также можете использовать свою функцию для вычитания только пробелов с некоторыми настройками. Попробуйте так:

func sostituisci(stringa: String) -> String { 
    return stringa.stringByReplacingOccurrencesOfString(" ", withString: "") 
} 

sostituisci("1 234 567 8901") // "12345678901" 

или как расширение:

extension String { 
    var sostituisci: String { 
     return stringByReplacingOccurrencesOfString(" ", withString: "") 
    } 
} 
let phoneNumber2 = "1 234 567 8901".sostituisci 
+1

Приобретено, очень полезно в понимании мощности компонентовSeperatedByCharactersInSet. –

+0

@DCGoD спасибо –