2016-04-03 86 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 
*/ 
相关问题