2017-03-27 281 views
0

我正在嘗試一個迅速的莫爾斯電碼轉換器操場。當我嘗試在iPad上運行它時,我不給我一個錯誤,告訴我檢查我的代碼。沒有編譯時錯誤,我擁有我需要的一切。我忘了包括什麼嗎?莫爾斯電碼轉換器不工作swift

import UIKit 
import Foundation 
import AVFoundation 
import PlaygroundSupport 


let alphaNumToMorse = [ 
    "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": "--..", 
    "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": "--..", 
    "1": ".----", 
    "2": "..---", 
    "3": "...--", 
    "4": "....-", 
    "5": ".....", 
    "6": "-....", 
    "7": "--...", 
    "8": "---..", 
    "9": "----.", 
    "0": "-----", 
    " ": " ", 
] 

// UI 
let window = UIView(frame: CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: 650, height: 650))) 
window.backgroundColor = UIColor.white 

let titleLabel = UILabel(frame: CGRect(origin: CGPoint(x: 20, y: 50), size: CGSize(width: 500, height: 50))) 
titleLabel.text = "Morse Code Translator" 
titleLabel.font = UIFont.systemFont(ofSize: 50, weight: UIFontWeightThin) 
window.addSubview(titleLabel) 

let directionsLabel = UILabel(frame: CGRect(origin: CGPoint(x: 20, y: 100), size: CGSize(width: 300, height: 50))) 
directionsLabel.text = "Type text to turn it into morse code." 
window.addSubview(directionsLabel) 

let inputField = UITextField(frame: CGRect(origin: CGPoint(x: 20, y: 150), size: CGSize(width: 610, height: 50))) 
inputField.text = "" 
inputField.placeholder = "Alpha-numeric characters only (ABC, abc, 123)." 
inputField.borderStyle = UITextBorderStyle.roundedRect 
window.addSubview(inputField) 

let translatedLabel = UILabel(frame: CGRect(origin: CGPoint(x: 20, y: 500), size: CGSize(width: 610, height: 150))) 
translatedLabel.font = UIFont.systemFont(ofSize: 12, weight: UIFontWeightThin) 
translatedLabel.lineBreakMode = NSLineBreakMode.byWordWrapping 
translatedLabel.numberOfLines = 10 
window.addSubview(translatedLabel) 

let outputLabel = UILabel(frame: CGRect(origin: CGPoint(x: 20, y: 700), size: CGSize(width: 610, height: 150))) 
outputLabel.text = "" 
window.addSubview(outputLabel) 

// Conversion 
func convertLetterToMorse(_ input: Character) -> String { 
    var returnChar = alphaNumToMorse[String(input)] 
    if returnChar == nil { 
     returnChar = "" 
    } 
    return returnChar! 
} 

var stringToConvert = String() 
func convertStringToMorse(_ input: String) -> String { 
    stringToConvert = input 
    let charsInString = input.characters 
    var returnString = "" 
    for char in charsInString { 
     let returnChar = convertLetterToMorse(char) 
     if returnChar != "" { 
      returnString += returnChar + " " 
      outputLabel.text = "\(returnString)" 
     } 
    } 
    return returnString 
} 

class convert: NSObject { 
    func convert(sender: UIButton!) { 
     let textFieldText = inputField.text 
     if textFieldText != nil { 
      let outputText = convertStringToMorse(textFieldText!) 
      translatedLabel.text = "\(outputText)" 
     } 

    } 
} 

let responder = UIResponder() 
let convertButton = UIButton(frame: CGRect(origin: CGPoint(x: 20, y: 200), size: CGSize(width: 100, height: 50))) 
convertButton.setTitle("Convert!", for: .normal) 
convertButton.setTitleColor(#colorLiteral(red: 0, green: 0.5008062124, blue: 1, alpha: 1), for: .normal) 
convertButton.addTarget(responder, action: #selector(convert.convert), for: .touchUpInside) 
window.addSubview(convertButton) 

PlaygroundPage.current.liveView = window 
+0

這可能是也可能不是你的問題,但你應該給你的字典有一個明確的類型:'let alphaNumToMorse:[String:String] = ['。使Swift推斷大型字典文字的類型可能會失敗或導致較差的編譯時間結果。 – vacawama

回答

0

您在類Convert中使用了inputField,但您從未定義它。

let textFieldText = inputField.text 

translationLabel也是如此。

+0

雖然它看起來和感覺不對,它們是在操場文件的全球範圍內定義的,所以在技術上這不是問題... – Alladinian

+0

它當然可以!我敢打賭,我沒有把它正確地轉換成非操場快速代碼。我需要在我的調查工具/技術列表中添加遊樂場。玩摩爾斯電碼。偉大的項目主題! – Mozahler

+0

這對我來說不算錯。這個類被認爲是「嵌套」的。 – Mozahler

2

按下按鈕時,您將看到

 
-[UIResponder convertWithSender:]: unrecognized selector sent to instance 0x610000018d20 

錯誤消息。問題就在這裏:

let responder = UIResponder() 
// ... 
convertButton.addTarget(responder, action: #selector(convert.convert), for: .touchUpInside) 

動作消息被髮送到UIResponder一個實例,而不是你的convert類的一個實例。

let responder = convert() 

應該解決這個問題。 (但請注意,類型斯威夫特通常開始 以一個大寫字母。)

注:轉換功能可以簡化爲

func convertStringToMorse(_ input: String) -> String { 
    return input.characters 
     .flatMap { alphaNumToMorse[String($0)] } 
     .joined(separator: " ") 
}