2016-03-21 21 views
2

Ich bin neu in der schnellen Entwicklung. Eigentlich ist es ein einfaches Problem, aber ich kann es nicht herausfinden. Ich habe eine String-Variable "name1", wo ich die Position im Alphabet für jedes Zeichen bestimmen und diese Positionen summieren möchte. Deshalb ich Schleife durch die Zeichenfolge und verwendet indexOf() für jedes ZeichenSwift: Index in Int umwandeln

let name1="myname" 
let sumPositions=0 

for index in 0...name1.characters.count-1{ 
sumPositions+="ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.indexOf(name1.startIndex+index); 
} 

ich den Fehler „Binary Operator‚+‘erhalten kann nicht auf Operanden vom Typ‚index‘aka‚String.characterView.index‘angewandt werden und ‚Int‘. Das bedeutet, ich habe zu werfen ‚index‘ auf ‚Int‘, aber ich habe keine Lösung für dieses.

+0

Mögliche Duplikat von [ Wenden Sie eine Zahl auf jeden Buchstaben im Text swift2] an (http://stackoverflow.com/questions/35927148/apply-a-number-to-each-letter-in-text-swift2). (Oder: [Wie durchfahre ich mit Swift während der Zuweisung von Werten das gesamte Alphabet?] (Http://stackoverflow.com/questions/28889172), je nachdem, ob der vorherige Link ein Duplikat des Letzteren ist) – dfri

Antwort

1

Leo Dabus eine nette Erweiterung hat hierfür in diesem post

extension String { 
    var letterValue: Int { 
     return Array("abcdefghijklmnopqrstuvwxyz".characters).indexOf(Character(lowercaseString)) ?? 0 
    } 

    var wordValue: Int { 
     // I prefer to use reduce 
     return characters.reduce(0) { $0 + String($1).letterValue } 
    } 
} 

let name1 = "myname" 
print(name1.wordValue) // 65 
+0

Nicht Besser, wir markieren diesen als Duplikat, statt eine Antwort von einem anderen Beitrag zu duplizieren. Das Q ist ein Duplikat von z.B. [der Thread, zu dem Sie eine Verknüpfung herstellen] (http://stackoverflow.com/questions/28889172/how-do-i-cycle-through-the-entire-alphabet-with-swift-while-assigning-values), oder für die spezifischer Anwendungsfall von Wort -> Summe von Buchstaben, [this thread] (http://stackoverflow.com/questions/35927148/apply-a-number-to-each-letter-in-text-swift2/35927473#35927473) . – dfri

+0

Ja, aber ich habe noch nie darüber nachgedacht, wie man einen als Duplikat markiert. Ich sehe, du hast das schon gemacht, also werde ich es einfach lassen, denke ich? :) – Eendje

+0

Ah, ich sehe, keine Sorgen! Du kannst markieren (nur eine vote-as-duplicate: kein Dupehammer bis 20k rep, glaube ich) einen Post ein mögliches Duplikat durch Drücken von 'close -> duplicate of' und füge den Link zu dem Thread ein, von dem du glaubst, dass du ihn markierst ein Duplikat von sein. – dfri

1

Es kann nicht so funktionieren.

Mein Vorschlag ist, dass Sie ein Array erstellen eine Reihe von Buchstaben aus dem Namen der Buchstaben des Alphabets, Sie dann indexOf verwenden, um die Buchstabenindex zu finden, hängen Sie alle Indizes in einem Array dann summieren Sie den Inhalt des Arrays:

let alphabetArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".lowercaseString.characters.map { String($0) } // ["a", "b", "c", "d", "e", "f", "g", ...] 

let name1 = "myname" 
let nameArray = name1.lowercaseString.characters.map { String($0) } // ["m", "y", "n", "a", "m", "e"] 

var positions = [Int]() 

for nameLetter in nameArray { 
    if let index = alphabetArray.indexOf(nameLetter) { 
     positions.append(index) 
    } 
} 

print(positions) // [12, 24, 13, 0, 12, 4] 

let sum = positions.reduce(0, combine: +) // 65 
Verwandte Themen