2016-04-03 97 views
3

說我有一個包含三個下劃線字符串的方法來替代第一個字符的字符串

var myString = "___" 

給定一個數字的字符串,字符串應該是這樣的

myString = "1__" 

如果用戶鍵入一個新的號碼,說2,該字符串將改變

myString = "12_" 

給定一個number,餘噸裏德編碼這樣的情況:

for i in myString.characters { 
    if (i == "_") { 
     newString = myString.stringByReplacingOccurrencesOfString("_", withString: number, options: NSStringCompareOptions.LiteralSearch, range: nil) 
     break 
    } 
} 

的問題是,stringByReplacingOccurrencesOfString一次全部替換字符。你認爲我應該用什麼字符串方法?

+0

你從哪兒擺在首位獲得價值?用戶正在輸入的單個文本字段? – ColGraff

+0

@KennethBruno我從手寫識別SDK獲得的值,不完全是一個文本字段 - 抱歉。我想讓事情儘可能簡單。 – Cesare

+1

好,所以你有價值1進1。爲什麼不把它們存儲在一個數組,並從中建立字符串? – ColGraff

回答

3

你可以把用戶輸入的字符串,並填充它與「_」:

var userInput = "1" // This is the string from the text field input by the user 

var finalText = userInput.stringByPaddingToLength(3, withString: "_", startingAtIndex: 0) 
+0

不錯。最好的解決方案:) – Darko

2

您可以指定要替換爲以下

let range = myString.rangeOfString("_") 
    if range != nil { 
     myString.stringByReplacingCharactersInRange(range, withString:number) 
    } 
+0

如果讓範圍= myStri ... – Darko

1

你的範圍之後改用stringByReplacingCharactersInRange可以用簡單的搜索和替換:

var template = "_____" 

func replace(template: String, _ character: String) -> String { 
    var newString = template 

    if let index = template.rangeOfString("_") { 
     newString.replaceRange(index, with: character) 
    } 

    return newString 
} 

template = replace(template, "1") 
print(template) 

template = replace(template, "2") 
print(template) 

請注意,有更好的soluti上。就個人而言,我會將值保存爲一個數組,並且我只會在需要時動態構建字符串,因爲使用字符數組更容易。

1

我敢肯定,有更優雅的解決方案,但也許它可以幫助:

var myString = "___" 

myString = "1__" 

let input = "6" 

for index in 0 ..< myString.characters.count { 
    let startIndex = myString.startIndex.advancedBy(index) 
    let endIndex = startIndex.advancedBy(1) 
    let range = startIndex..<endIndex 
    let substring = myString[range] 
    if substring == "_" { 
     myString = myString.stringByReplacingCharactersInRange(range, withString: input) 
     break 
    } 
} 
-1

乍一看您的問題,您應該使用範圍選項/說法是這樣的:

if let range = myString.rangeOfString("_") { 
    myString = myString.stringByReplacingOccurrencesOfString("_", withString: number, options: NSStringCompareOptions.LiteralSearch, range: range) 
} 
+0

爲什麼這裏有一個downvote? ( –

1

只需一種方法,使用計算屬性和簡單的Swift而不使用NSString方法。

class Display { 
    var accumulated = [String]() 
    var display:String { 
    return (accumulated.prefix(3) + ["_","_","_"]) 
     .prefix(3).joinWithSeparator("") 
    } 

    func addNumber(number:Int) { 
    accumulated.append(String(number)) 
    } 
} 

let first = Display() 
print(first.display) // => "___" 
first.addNumber(1) 
print(first.display) // => "1__" 
first.addNumber(2) 
print(first.display) // => "12_" 
first.addNumber(3) 
print(first.display) // => "123" 
first.addNumber(4) 
print(first.display) // => "123" 
3

我個人還是贊成@giorashc:s native padding solution(*),但要額外增加了各種各樣的答案這個問題(因爲這個問答&一個已經包含了一些變化),你也可以利用suffixFrom(...)的方法爲您的模板字符串(___)的CharacterView實現填充行爲。例如: -

/* Example (if length of string >= template: just return string) */ 
let padToTemplate: (str: String, withTemplate: String) -> String = { 
    return $0.characters.count < $1.characters.count 
     ? $0 + String($1.characters.suffixFrom($0.characters.endIndex)) 
     : $0 
} 

/* Example usage */ 
let myString = padToTemplate(str: "1", withTemplate: "___") 
print(myString) // 1__ 

(*)謝謝@KennethBruno用於指出.stringByPaddingToLength(..)NSString,而不是原生斯威夫特!

+0

)他的解決方案如何是本地的?它使用從Swift的'String'到Cocoa的'NSString'的橋樑。不是說有任何問題,使用任何工作,但本地通常意味着Swift-only。此外,爲什麼使用閉包而不是一個函數?你基本上用一個不可變變量和一個閉包來模擬函數。使用函數語法不是更清楚嗎? – ColGraff

+1

@KennethBruno感謝您的反饋!我沒有意識到'.stringByPaddingToLength( ..)'是來自'NSString'(從未見過,所以我只是想錯過一個Swift'String'本地方法)。至於閉包和函數;我會說這是一個偏好問題(在像Swift這樣的半功能語言,函數只是閉包的一個特例)我有時候傾向於在閉包中使用答案,因爲它給了我一些額外的練習,這些練習對於我不太熟悉的東西,比如寫作函數/方法(或_special case_closedures;))。 – dfri

+1

我覺得最好是測試沒有任何'import'語句的例子。毫無疑問,如果你在這裏有一個閉包,就可以取代一個功能,但對於那些不經意的讀者來說,這只是一點點不清楚。現在,如果它是可變的,那麼你可以隨意更換閉包,這是一個非常有趣的動態更改「函數」的方法。 – ColGraff

1

「純」迅速解決(無需基金會)

var myString = "___" 
let input = ["1","2","3","4","5"] 

var arr = myString.characters.map { String($0) } 
var idx = 0 

input.forEach { (i) in 
    if idx < myString.characters.count { 
     arr.insert(i, atIndex: arr.startIndex.advancedBy(idx)) 
     idx += 1 
     arr.removeLast() 
     myString = arr.joinWithSeparator("") 

     print(myString) 

    } 
} 

/* 
1__ 
12_ 
123 
*/ 
相關問題