如何在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)
    }
}