Can't compare string entered through terminal to another string in Swift - swift

I am using the following code to implement basic dictionary using swift. However the compiler is not returning any values. I don't know what seems to be the problem. Need Help!
P.S I'm new to Swift.
import Foundation
var dic = ["Nil":"Neel Goswami","Kirana":"Kinara Shah","Sapre":"Rohan Sapre","JP":"Joy Patel","Shreya":"Shrey Bhat","Ali Bhai":"Aalisha Sheth","Gandhi":"Shlok Gandhi","Binti":"Biyanta Shah","Udgam":"Aayushi Shah"]
dic["Wary"] = "Aishwary Rawat"
dic["Sixer"] = "Ruchir Patel"
dic["Bhikhari"] = "Aabhas Singhal"
var str: String? = "Initial"
println("Enter the pet name: ")
str = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
var st: String = str!
for (pet, act) in dic
{
if (pet == st) {
println("His/Her actual name is \(act)")
}
}

The problem is that the string from the user input contains a trailing newline character
(\n). You can fix that by changing
var st: String = str!
to
var st = str!.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
Alternatively, use
var st = str!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
which removes leading and trailing space characters as well.
Note that you could simplify your for-loop to a dictionary lookup:
if let act = dic[st] {
println("His/Her actual name is \(act)")
}

Related

How get seperated lines inside a CFString?

I want a good way for seperating lines inside a huge string. I searched and found this article:
https://medium.com/#sorenlind/three-ways-to-enumerate-the-words-in-a-string-using-swift-7da5504f0062
Base on this article I want use CFStringTokenizer. So I changed kCFStringTokenizerUnitWord to kCFStringTokenizerUnitLineBreak and finally I use this code:
func tokenize(_ str:String) -> [String] {
var inputRange = CFRangeMake(0, str.count)
var flag = UInt(kCFStringTokenizerUnitLineBreak)
var locale = CFLocaleCopyCurrent()
var tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, str as CFString, inputRange, flag, locale)
var tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
while tokenType != []
{
var currentTokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer)
var substring = substringWithRange(str, aRange: currentTokenRange)
tokens.append(substring)
tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
}
return tokens
}
But It return me seperated words not seperated lines. What is the problem? Or If another way(good performance) you can suggest. Thanks.

Display of special characters \u{n}

Impossible to find the solution ; it does not work...
I've been on this for hours... A little help will give me the opportunity to sleep without a nightmare...
Where is the error ?
let num: Int = 128150 // smiley = "\u{1F496}" => 128150
var str: String = String(num, radix: 16)
str = str.uppercased()
var wkHex: String = "\\u{"+str+"}" // wkHex = "\u{"+str+"}" not match
wkHex.characters.removeFirst(0) // remove "\" unnecessary at startIndex
let cnt = wkHex.characters.count
let zzz: Array = Array(wkHex.characters)
var car: String = ""
for i in 0...cnt - 1 {
car.append(zzz[i])
}
outputChar.stringValue = car // outputChar is a Label (NSTextField)
// output : \u{1F496} ! instead of : 💖
So the idea is to go from a code point to a character?
let iii = 128150
let char = Character(UnicodeScalar(iii)!)
print(char) // 💖
Swift only allows you to use the \u{...} syntax at compile time. This means that the string won't be turned into the emoji at runtime, when the value of num is known.
To do this, you can use UnicodeScalar:
let unicode = UnicodeScalar(128150)
unicode?.description // 💖

Cannot invoke initializer for type: with an argument list of type '(_Element)'

I am new on Swift. I am trying to convert string to character array and I want the integer value of character. Here is my code:
var string = "1234"
var temp = Array(string.characters)
var o = Int(temp[0])
But at line 3 I am getting above error. What's wrong with this code?
Please help me
You need to map your Character to String because Int has no Character initializer.
You can also map your Character array to String Array
var temp = string.characters.map(String.init)
or convert your character to String when initializing your var
var o = Int(String(temp[0]))
Swift 4
let string = "1234"
let temp = string.map(String.init)
let o = Int(temp[0])

String replacement not working with Dictionary

I have a mini dictionary that I would like to use in order to replace occurrences of text within a user's inputted string. However, instead of replacing every occurrence of a particular string, it retains the original string. For example, user types:
"The girl went to school"
My program still returns "The girl went to school". It should come out as "The binguel debbo went to jangirde"
func input() -> String {
let keyboard = NSFileHandle.fileHandleWithStandardInput()
let inputData = keyboard.availableData
return (NSString(data: inputData, encoding:NSUTF8StringEncoding)?.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()))! as! String
}
var userInput = "" //Declares original user input
var finalSentence:String = "" //Declares a string variable for the final sentence
var newUserString:String
var fulfuldeWords = ["man":"gorko", "woman":"debbo",
"boy":"binguel gorko", "girl": "binguel debbo", "work":"golle",
"school":"jangirde", "water":"ndiyam", "horse":"puccu", "cow":"na'i",
"hat":"hufunere", "house":"wuro", "courage":"cuusal", "camel":"gelodi",
"milk":"kossam"
]
print("Please enter a sentence to be partially translated: ") //Ask user for input
userInput = input()
var theStringArray = userInput.componentsSeparatedByString(" ")
for (englishWord, fulaniWord) in fulfuldeWords {
finalSentence = userInput.stringByReplacingOccurrencesOfString(englishWord, withString: fulaniWord)
}
print(finalSentence)
This is being done in Swift and I don't get why it's not working. Where did I go wrong in my code. Thanks!
You need to perform the function stringByReplacingOccurencesOfString on the same variable to get your desired result. So, in your code, store the result on userInput and print as the output as well.
for (englishWord, fulaniWord) in fulfuldeWords {
userInput = userInput.stringByReplacingOccurrencesOfString(englishWord, withString: fulaniWord)
}
print(userInput)

How to append a character to a string in Swift?

This used to work in Xcode 6: Beta 5. Now I'm getting a compilation error in Beta 6.
for aCharacter: Character in aString {
var str: String = ""
var newStr: String = str.append(aCharacter) // ERROR
...
}
Error: Cannot invoke append with an argument of type Character
Update for the moving target that is Swift:
Swift no longer has a + operator that can take a String and an array of characters. (There is a string method appendContentsOf() that can be used for this purpose).
The best way of doing this now is Martin R’s answer in a comment below:
var newStr:String = str + String(aCharacter)
Original answer:
This changed in Beta 6. Check the release notes.I'm still downloading it, but try using:
var newStr:String = str + [aCharacter]
This also works
var newStr:String = str + String(aCharacter)
append append(c: Character) IS the right method but your code has two other problems.
The first is that to iterate over the characters of a string you must access the String.characters property.
The second is that the append method doesn't return anything so you should remove the newStr.
The code then looks like this:
for aCharacter : Character in aString.characters {
var str:String = ""
str.append(aCharacter)
// ... do other stuff
}
Another possible option is
var s: String = ""
var c: Character = "c"
s += "\(c)"
According to Swift 4 Documentation ,
You can append a Character value to a String variable with the String type’s append() method:
var welcome = "hello there"
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"
var stringName: String = "samontro"
var characterNameLast: Character = "n"
stringName += String(characterNameLast) // You get your name "samontron"
I had to get initials from first and last names, and join them together. Using bits and pieces of the above answers, this worked for me:
var initial: String = ""
if !givenName.isEmpty {
let char = (givenName as NSString).substring(with: NSMakeRange(0, 1))
let str = String(char)
initial.append(str)
}
if !familyName.isEmpty {
let char = (familyName as NSString).substring(with: NSMakeRange(0, 1))
let str = String(char)
initial.append(str)
}
for those looking for swift 5, you can do interpolation.
var content = "some random string"
content = "\(content)!!"
print(content) // Output: some random string!!
let original:String = "Hello"
var firstCha = original[original.startIndex...original.startIndex]
var str = "123456789"
let x = (str as NSString).substringWithRange(NSMakeRange(0, 4))
var appendString1 = "\(firstCha)\(x)" as String!
// final name
var namestr = "yogesh"
var appendString2 = "\(namestr) (\(appendString1))" as String!*