如何在 swift 中调用 Extension 中的函数?

how to call function in Extension in swift?

我正在制作一个应用程序,但我对如何调用扩展文件中的函数感到困惑。

这是我尝试从扩展中调用函数的代码。

import UIKit

class RecipeTableViewCell: UITableViewCell {

    @IBOutlet weak var commnetLabel: UILabel!
    @IBOutlet weak var recipeImageView: UIImageView!
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var recipeTypeLabel: UILabel!


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }


    func configureView(recipe: RecipeData){
    
        commnetLabel.text = recipe.comment
        recipeImageView.setImage(imageUrl: recipe.imageUrl)
    //  dateLabel.text = recipe.recordedAt => get something like 2020-10-01 11:08:42

        dateLabel.text = setTemplate(strDate: recipe.recordedAt)
        recipeTypeLabel.text = recipe.recipeType

    }

}

在configureView函数中,我曾经写过dateLabel.text = recipe.recordedAt来向应用程序显示日期。我现在想改变它的显示方式,所以我创建了一个扩展。

import Foundation

extension DateFormatter {

    func setTemplate (strDate: String) -> String {
    
    
        let dateFormatter = DateFormatter()
    
        dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale: Locale(identifier: "ja_JP"))
    
        let result = dateFormatter.string(from: Date())
    
        return result
    }
}

我认为在 configureView 函数中写入 dateLabel.text = setTemplate(strDate: recipe.recordedAt) 可以调用 setTemplate 函数并更改我的 dateLabel 的文本。但是,目前我得到

Use of unresolved identifier 'setTemplate'

我对为什么以及如何访问 setTemplate 函数感到困惑。

谁能告诉我为什么会出现错误以及我做错了什么?

您可能打算扩展 RecipeTableViewCell,而不是 DateFormatter

extension RecipeTableViewCell {
    func setTemplate(strDate: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale: Locale(identifier: "ja_JP"))
        let result = dateFormatter.string(from: Date())
    
        return result
    }
}

如果扩展 DateFormatter,函数 setTemplate 将添加到 class DateFormatter -- 您无法从 RecipeTableViewCell 访问它。但是如果你真的想扩展 DateFormatter,你可以这样做:

extension DateFormatter {
    func setTemplate(strDate: String) -> String {
        self.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale: Locale(identifier: "ja_JP"))
        let result = self.string(from: Date())

        return result
    }
}

/// usage:
let formatter = DateFormatter()
dateLabel.text = formatter.setTemplate(strDate: recipe.recordedAt)

直接扩展 DateFormatter 可以让您从任何地方(不仅仅是 RecipeTableViewCell)访问 setTemplate,因此您可能想要这样做。

你的函数是正确的,但你只需要将它设为静态即可。刚刚在 PLayground 中测试并且有效。

extension DateFormatter {

 static func setTemplate (strDate: String) -> String {


    let dateFormatter = DateFormatter()

    dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale: Locale(identifier: "ja_JP"))

    let result = dateFormatter.string(from: Date())

    return result
 }
}