如何在 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
}
}
我正在制作一个应用程序,但我对如何调用扩展文件中的函数感到困惑。
这是我尝试从扩展中调用函数的代码。
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
}
}