将字符串传递给附加在SwiftUI中的按钮的操作

时间:2019-08-08 18:22:56

标签: swift swiftui

我正在尝试将文本字段中的字符串传递给按钮操作。这段代码的重点是采用一个键入的短语并大声说出来。当我用静态文本运行代码时,我得到了期望的结果(即,大声读取了静态文本)。但是,当我尝试修改代码以传递键入的文本时,总是收到一条错误消息,提示“()”不能转换为“()-> Void”。我不确定错误在哪里。

有效的原始代码

import SwiftUI
import AVFoundation

struct ContentView: View {

    @State var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter Text Here", text: $text)
            Text(text)
            Button(action: Speek) {
            Text("Speek")
            }
        }

    }
}

func Speek {
    let utterance = AVSpeechUtterance(string: "This is a test")
    utterance.voice = AVSpeechSynthesisVoice(language: "en-US")

    let synthesizer = AVSpeechSynthesizer()
    synthesizer.speak(utterance)
}

产生错误的代码

import SwiftUI
import AVFoundation

struct ContentView: View {

    @State var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter Text Here", text: $text)
            Text(text)
            Button(action: Speek(phrase: text)) {
            Text("Speek")
            }
        }

    }
}

func Speek (phrase: String) {
    let utterance = AVSpeechUtterance(string: phrase)
    utterance.voice = AVSpeechSynthesisVoice(language: "en-US")

    let synthesizer = AVSpeechSynthesizer()
    synthesizer.speak(utterance)
}

3 个答案:

答案 0 :(得分:0)

非常很亲密。事实是,您不需要需要通过-您已经拥有了!这是有效的代码:

struct ContentView: View {

    @State var text: String = ""
    var body: some View {
        VStack {
            TextField("Enter Text Here", text: $text)
            Text(text)
            Button(action: {
                self.speak()
            }) {
                HStack {
                    Image(systemName:"faceid").font(Font.body.weight(.bold))
                    Text("Speak").font(Font.body.weight(.bold))
                }.frame(width: 150)
            }
        }
    }
    func speak () {
        let utterance = AVSpeechUtterance(string: text)
        utterance.voice = AVSpeechSynthesisVoice(language: "en-US")

        let synthesizer = AVSpeechSynthesizer()
        synthesizer.speak(utterance)
    }
}
  • 我所做的唯一相关更改是删除了函数和调用中的所有phrase痕迹,并仅使用了text。我可能做了第二个相关更改,因为您发布的代码并未明确表明该功能应该是ContentView的一部分。
  • 我乐意(a)将函数名称从“ Speek”更改为“ Speak”-由于您使用的是en-US,我认为正确的拼写看起来会更好,并且(b)正确地将函数名称命名为“ camel-case”,因为这就是大多数Swift代码的方式。

最后,我对以上代码的最后建议-将speak移至ObservableObject(基本上是class和/或您的模型)中,并将其公开为{{1 }}。您完成的工作很多,包括从UI中删除功能代码(EnvirronmentObject)。

答案 1 :(得分:0)

尝试

Button(action: { Speek(phrase: text) } ) 

//请注意,函数名称应以小写字母开头

答案 2 :(得分:0)

@dfd确实有一个答案,但没有说明您的代码为什么不起作用以及为什么他的代码现在不起作用。

Button的动作具有功能。在第一种情况下,您将其传递给函数Speak。类型为() -> Void,表示它不带参数也不返回值。

在错误情况下,您正在调用函数,因此该函数调用的结果将作为action:的参数传递。正如我刚刚提到的,Speak函数的结果为Void

也很高兴知道Void()的别名。