2015-03-05 8 views
4

Я пытаюсь перебирать весь алфавит с помощью Swift. Единственная проблема заключается в том, что я хотел бы присвоить значения каждой букве.Как мне перебирать весь алфавит с помощью Swift при назначении значений?

Для примера: а = 1, Ь = 2, с = 3 и так далее, пока не дойдете до г, который будет = 26.

Как пройти через каждую букву в текстовом поле, которое пользователь вводит используя значения, ранее назначенные буквам в алфавите?

После этого, как бы я добавил все значения букв, чтобы получить сумму для всего слова. Я ищу простейший возможный способ выполнить это, но работает так, как мне бы хотелось.

Любые предложения?

Спасибо заранее.

+0

Я думаю, что это поможет вам в правильном направлении: http://stackoverflow.com/a/24102584/421755 – Simon

ответ

6

редактировать/обновление: Xcode 7.2.1 • Swift 2.1.1

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var strWordValue: UILabel! 
    @IBOutlet weak var strInputField: UITextField! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func sumLettersAction(sender: AnyObject) { 
     strWordValue.text = strInputField.text?.wordValue.description 

    } 

} 

Расширения

extension String { 
    var letterValue: Int { 
     return Array("abcdefghijklmnopqrstuvwxyz".characters).indexOf(Character(lowercaseString))?.successor() ?? 0 
    } 
    var wordValue: Int { 
     var result = 0 
     characters.forEach { result += String($0).letterValue } 
     return result 
    } 
} 

enter image description here

func letterValue(letter: String) -> Int { 
    return Array("abcdefghijklmnopqrstuvwxyz".characters).indexOf(Character(letter.lowercaseString))?.successor() ?? 0 
} 

func wordValue(word: String) -> Int { 
    var result = 0 
    word.characters.forEach { result += letterValue(String($0)) } 
    return result 
} 


let aValue = letterValue("a") // 1 
let bValue = letterValue("b") // 2 
let cValue = letterValue("c") // 3 
let zValue = letterValue("Z") // 26 

let busterWordValue = wordValue("Buster") // 85 
let busterWordValueString = wordValue("Buster").description // "85" 

//

extension Character { 
    var lowercase: Character { return Character(String(self).lowercaseString) } 
    var value: Int { return Array("abcdefghijklmnopqrstuvwxyz".characters).indexOf(lowercase)?.successor() ?? 0 } 
} 
extension String { 
    var wordValue: Int { return Array(characters).map{ $0.value }.reduce(0){ $0 + $1 } } 
} 

"Abcde".wordValue // 15 
+1

Я пытался выяснить, как это сделать с индексом массива. Но дальность расположения слова - лучший подход. – Fogmeister

+0

@Fogmeister спасибо –

+0

Будет ли это также работать с заглавными буквами, а также – Bigfoot11

0

Я бы создать функцию что-то вроде этого ...

func valueOfLetter(inputLetter: String) -> Int { 
    let alphabet = ["a", "b", "c", "d", ... , "y", "z"] // finish the array properly 

    for (index, letter) in alphabet { 
     if letter = inputLetter.lowercaseString { 
      return index + 1 
     } 
    } 

    return 0 
} 

Затем вы можете перебирать слово ...

let word = "hello" 
var score = 0 

for character in word { 
    score += valueOfLetter(character) 
} 
+0

Ошибка: «String» не конвертируется в '([String], [String]) – Bigfoot11

+0

А, извините, я использовал неправильный метод перечисления для получения индекса, значение кортежа. Я не могу сейчас смотреть, но если вы ищете Google для быстрого массива, вы найдете правильный метод. – Fogmeister

0

Назначение буквы итерируя над ними и создание словаря с буквами, которые соответствуют их значениям:

let alphabet: [String] = [ 
    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" 
] 

var alphaDictionary = [String: Int]() 
var i: Int = 0 

for a in alphabet { 
    alphaDictionary[a] = ++i 
} 

Используйте Свифт встроенного массив reduce фу nction подытожить буквы, возвращаемые из вашего UITextViewDelegate:

func textViewDidEndEditing(textView: UITextView) { 
    let sum = Array(textView.text.unicodeScalars).reduce(0) { a, b in 
     var sum = a 

     if let d = alphaDictionary[String(b).lowercaseString] { 
      sum += d 
     } 

     return sum 
    } 
} 
0

Может быть, вы ищете что-то вроде этого:

func alphabetSum(text: String) -> Int { 
    let lowerCase = UnicodeScalar("a")..."z" 
    return reduce(filter(text.lowercaseString.unicodeScalars, { lowerCase ~= $0}), 0) { acc, x in 
     acc + Int((x.value - 96)) 
    } 
} 


alphabetSum("Az") // 27 case insensitive 
alphabetSum("Hello World!") // 124 excludes non a...z characters 

Последовательность text.lowercaseString.unicodeScalars (нижний регистр текста Юникод скаляр) фильтруется filter сохраняя только скаляры, которые шаблон соответствует~= с диапазоном lowerCase. reduce суммирует все отфильтрованные скалярные значения сдвинуто на -96 (такое, что 'a' дает 1 и т. Д.). reduce начинается с аккумулятора (acc) значение 0. В этом решении оператор сопоставления с образцом будет просто проверять, чтобы значение скалярного значения находилось между lowerCase.start (a) и lowerCase.end (z), поэтому нет никакого поиска или петли в массив символов.

0

Я только что собрал следующую функцию в swiftstub.com и, похоже, работает так, как ожидалось.

func getCount(word: String) -> Int { 
    let alphabetArray = Array(" abcdefghijklmnopqrstuvwxyz") 
    var count = 0 

    // enumerate through each character in the word (as lowercase) 
    for (index, value) in enumerate(word.lowercaseString) { 
     // get the index from the alphabetArray and add it to the count 
     if let alphabetIndex = find(alphabetArray, value) { 
      count += alphabetIndex 
     } 
    } 

    return count 
} 

let word = "Hello World" 
let expected = 8+5+12+12+15+23+15+18+12+4 

println("'\(word)' should equal \(expected), it is \(getCount(word))") 

// 'Hello World' should equal 124 :) 

Функция перебирает каждый символ в строке, вы проходите в нее, и использует функцию find, чтобы проверить, существует ли символ (значение) в последовательности (alphabetArray), и если он делает это возвращает индекс из последовательности. Затем индекс добавляется к счету, и когда все символы отмечены, возвращается счетчик.

 Смежные вопросы

  • Нет связанных вопросов^_^