键盘功能有问题?
Problems with keyboard functions?
我在键盘上的 return 键执行代码时遇到了一些问题。我过去曾尝试过,以下代码运行良好:
func textFieldShouldReturn(textField: UITextField) -> Bool{
textField.resignFirstResponder()
valueOfLetter()
return true;
}
但是,由于某种原因,valueOfLetter
行出现错误。
这是完整的文件以备不时之需:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBOutlet weak var strWordValue: UILabel!
@IBOutlet weak var strInputField: UITextField!
func textFieldShouldReturn(textField: UITextField) -> Bool{
textField.resignFirstResponder()
valueOfLetter()
return true;
}
var TextField: UITextField!
func valueOfLetter(inputLetter: String) -> Int {
let alphabet = ["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"]
for (index, letter) in alphabet {
if letter = inputLetter.lowercaseString {
return index + 1
for character in word {
score += valueOfLetter(character)
}
}
}
return 0
}
}
错误是:“调用中参数 #1 缺少参数
for (index, letter) in alphabet
行中的另一个错误是:'String' not convertible to '([String, String])'
我不确定这些错误的含义或如何修复它们。
如有任何意见或建议,我们将不胜感激。
提前致谢。
你的方法valueOfLetter
需要一个参数,你需要用参数调用它,否则它不会起作用。例如:
valueOfLetter("x")
发生第二个错误是因为您使用了一种语法结构,该语法结构用于使用数组遍历字典。使用内置的 enumerate
函数迭代具有索引值的数组:
for (index, letter) in enumerate(alphabet) {
if letter = inputLetter.lowercaseString {
return index + 1
for character in word {
score += valueOfLetter(character)
}
}
}
错误消息是因为您的 [String]
数组无法作为一对索引和值进行快速枚举。为此,您需要使用上述 enumerate
函数。
我建议将您的 alphabet
数组提升为全局变量或成员变量。您可以将其标记为私有,以便它在该源文件之外不可见。
// A through Z
private let alphabet = ["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"]
您可以使用两个函数来计算单词的分数。第一个函数将计算特定字母的点数。第二个函数将获取一个字符串并对其进行枚举,对每个字母的点值求和。
func valueOfLetter(letter: Character) -> Int
{
let letterString = String(letter).uppercaseString
let index = find(alphabet, letterString)
return index != nil ? index! + 1 : 0
}
func scoreForWord(word: String) -> Int
{
let characters = Array(word)
return characters.reduce(0) { sum, letter in sum + valueOfLetter(letter) }
}
我知道这与您的初始设置有点不同。我只是想指出 built-in Swift library functions are 的用处。即 filter
、map
和 reduce
.
编辑:以下是如何通过 UITextFieldDelegate
使用每种方法:
// This will be called every time the text changes in the UITextField
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
let currentWord = textField.text as NSString
let newWord = currentWord.stringByReplacingCharactersInRange(range, withString: string)
let score = scoreForWord(newWord)
// Do something with the score here
return true
}
// This will be called when the return key is pressed
func textFieldShouldReturn(textField: UITextField) -> Bool
{
let word = textField.text
let score = scoreForWord(word)
// Do something with the score here
return true
}
我在键盘上的 return 键执行代码时遇到了一些问题。我过去曾尝试过,以下代码运行良好:
func textFieldShouldReturn(textField: UITextField) -> Bool{
textField.resignFirstResponder()
valueOfLetter()
return true;
}
但是,由于某种原因,valueOfLetter
行出现错误。
这是完整的文件以备不时之需:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBOutlet weak var strWordValue: UILabel!
@IBOutlet weak var strInputField: UITextField!
func textFieldShouldReturn(textField: UITextField) -> Bool{
textField.resignFirstResponder()
valueOfLetter()
return true;
}
var TextField: UITextField!
func valueOfLetter(inputLetter: String) -> Int {
let alphabet = ["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"]
for (index, letter) in alphabet {
if letter = inputLetter.lowercaseString {
return index + 1
for character in word {
score += valueOfLetter(character)
}
}
}
return 0
}
}
错误是:“调用中参数 #1 缺少参数
for (index, letter) in alphabet
行中的另一个错误是:'String' not convertible to '([String, String])'
我不确定这些错误的含义或如何修复它们。
如有任何意见或建议,我们将不胜感激。
提前致谢。
你的方法valueOfLetter
需要一个参数,你需要用参数调用它,否则它不会起作用。例如:
valueOfLetter("x")
发生第二个错误是因为您使用了一种语法结构,该语法结构用于使用数组遍历字典。使用内置的 enumerate
函数迭代具有索引值的数组:
for (index, letter) in enumerate(alphabet) {
if letter = inputLetter.lowercaseString {
return index + 1
for character in word {
score += valueOfLetter(character)
}
}
}
错误消息是因为您的 [String]
数组无法作为一对索引和值进行快速枚举。为此,您需要使用上述 enumerate
函数。
我建议将您的 alphabet
数组提升为全局变量或成员变量。您可以将其标记为私有,以便它在该源文件之外不可见。
// A through Z
private let alphabet = ["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"]
您可以使用两个函数来计算单词的分数。第一个函数将计算特定字母的点数。第二个函数将获取一个字符串并对其进行枚举,对每个字母的点值求和。
func valueOfLetter(letter: Character) -> Int
{
let letterString = String(letter).uppercaseString
let index = find(alphabet, letterString)
return index != nil ? index! + 1 : 0
}
func scoreForWord(word: String) -> Int
{
let characters = Array(word)
return characters.reduce(0) { sum, letter in sum + valueOfLetter(letter) }
}
我知道这与您的初始设置有点不同。我只是想指出 built-in Swift library functions are 的用处。即 filter
、map
和 reduce
.
编辑:以下是如何通过 UITextFieldDelegate
使用每种方法:
// This will be called every time the text changes in the UITextField
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
let currentWord = textField.text as NSString
let newWord = currentWord.stringByReplacingCharactersInRange(range, withString: string)
let score = scoreForWord(newWord)
// Do something with the score here
return true
}
// This will be called when the return key is pressed
func textFieldShouldReturn(textField: UITextField) -> Bool
{
let word = textField.text
let score = scoreForWord(word)
// Do something with the score here
return true
}