如何在swift5.5、Xcode13中写一个按钮函数
How to write a button function in swift 5.5, Xcode 13
所以我试图通过获取创建新按钮所需的代码并将其放入名为 makeButton 的函数中来使代码更整洁。
我对 swift 和 Xcode 很陌生,我的想法是在 Java 中几乎完全使用方法来实现更大的抽象,所以我应该尝试做同样在这里。
这是我写的代码,我很难理解为什么我会遇到编译器错误;具体来说:“类型‘()’不能符合 'View'。”我究竟做错了什么?在我看来,这完全适用于 Java。
这是我的代码:
[在此处输入图片描述][1]
import AVFoundation
struct ContentView: View {
let buttonText1 : String = "hello world"
let buttonText2 : String = "welcome to Swift!"
var body: some View {
VStack {
makeButton(text: buttonText1, bezel: 10);
makeButton(text: buttonText2, bezel: 10);
}
}
func makeButton(text: String, bezel: CGFloat){
Button{
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-gb")
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
}label: {
Text(text)
.fontWeight(.bold)
.font(.system(.title, design: .rounded))
.font(.title)
}
.padding()
.foregroundColor(.yellow)
.background(Color.red)
.cornerRadius(bezel)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
[1]: https://i.stack.imgur.com/xcuyN.png
发生错误是因为在 Swift 中,您需要明确注释 return 类型的函数。
您的函数签名应如下所示:
func makeButton(text: String, bezel: CGFloat) -> some View {
您还会注意到,在您当前的代码中,有一个警告:
Result of call to 'cornerRadius(_:antialiased:)' is unused
这源于同一个问题——如果没有 return 类型,Swift 会认为您只是在创建一个 Button
并且什么都不做。但是,对于 return 类型,您拥有所谓的“隐式 return”,这意味着单数语句会自动从函数中获取 return。
最后,与函数相反,Swift-ier 方法是组合 View
。所以,重构看起来像这样:
struct ContentView: View {
let buttonText1 : String = "hello world"
let buttonText2 : String = "welcome to Swift!"
var body: some View {
VStack {
MyButton(text: buttonText1, bezel: 10)
MyButton(text: buttonText2, bezel: 10)
}
}
}
struct MyButton : View {
var text : String
var bezel : CGFloat
var body: some View {
Button{
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-gb")
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
}label: {
Text(text)
.fontWeight(.bold)
.font(.system(.title, design: .rounded))
.font(.title)
}
.padding()
.foregroundColor(.yellow)
.background(Color.red)
.cornerRadius(bezel)
}
}
所以我试图通过获取创建新按钮所需的代码并将其放入名为 makeButton 的函数中来使代码更整洁。
我对 swift 和 Xcode 很陌生,我的想法是在 Java 中几乎完全使用方法来实现更大的抽象,所以我应该尝试做同样在这里。 这是我写的代码,我很难理解为什么我会遇到编译器错误;具体来说:“类型‘()’不能符合 'View'。”我究竟做错了什么?在我看来,这完全适用于 Java。 这是我的代码:
[在此处输入图片描述][1]
import AVFoundation
struct ContentView: View {
let buttonText1 : String = "hello world"
let buttonText2 : String = "welcome to Swift!"
var body: some View {
VStack {
makeButton(text: buttonText1, bezel: 10);
makeButton(text: buttonText2, bezel: 10);
}
}
func makeButton(text: String, bezel: CGFloat){
Button{
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-gb")
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
}label: {
Text(text)
.fontWeight(.bold)
.font(.system(.title, design: .rounded))
.font(.title)
}
.padding()
.foregroundColor(.yellow)
.background(Color.red)
.cornerRadius(bezel)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
[1]: https://i.stack.imgur.com/xcuyN.png
发生错误是因为在 Swift 中,您需要明确注释 return 类型的函数。
您的函数签名应如下所示:
func makeButton(text: String, bezel: CGFloat) -> some View {
您还会注意到,在您当前的代码中,有一个警告:
Result of call to 'cornerRadius(_:antialiased:)' is unused
这源于同一个问题——如果没有 return 类型,Swift 会认为您只是在创建一个 Button
并且什么都不做。但是,对于 return 类型,您拥有所谓的“隐式 return”,这意味着单数语句会自动从函数中获取 return。
最后,与函数相反,Swift-ier 方法是组合 View
。所以,重构看起来像这样:
struct ContentView: View {
let buttonText1 : String = "hello world"
let buttonText2 : String = "welcome to Swift!"
var body: some View {
VStack {
MyButton(text: buttonText1, bezel: 10)
MyButton(text: buttonText2, bezel: 10)
}
}
}
struct MyButton : View {
var text : String
var bezel : CGFloat
var body: some View {
Button{
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-gb")
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
}label: {
Text(text)
.fontWeight(.bold)
.font(.system(.title, design: .rounded))
.font(.title)
}
.padding()
.foregroundColor(.yellow)
.background(Color.red)
.cornerRadius(bezel)
}
}