gpt4 book ai didi

Swift - 代码重用

转载 作者:搜寻专家 更新时间:2023-11-01 06:32:24 25 4
gpt4 key购买 nike

我正在寻求有关代码重用的一些建议。

我有一个 View Controller (在这个阶段)有 12 个标签和 12 个文本字段。

对于这些标签和字段中的每一个,都有重复的代码行(请参阅下面的注释行)。

我想知道在创建标签和文本字段时重复使用代码行的最佳方法,而不是一直重写它们。

我研究了扩展,创建了一个类,还继承了通用代码行,但我总是碰壁。

我已经使用一个类来填充文本字段并理解它是如何工作的,但我似乎无法将其他通用属性添加到该类中。谢谢

例子:

let LabelA = UILabel()
// LabelA.backgroundColor = .clear
// LabelA.widthAnchor.constraint(equalToConstant: 150).isActive = true
// LabelA.font = LabelA.font.withSize(18)
// LabelA.textAlignment = .left
LabelA.text = “This is my 1st label of 12“

let LabelB = UILabel()
// LabelB.backgroundColor = .clear
// LabelB.widthAnchor.constraint(equalToConstant: 150).isActive = true
// LabelB.font = LabelB.font.withSize(18)
// LabelB.textAlignment = .left
LabelB.text = “This is my 2nd label of 12“

let LabelC = UILabel()
// LabelC.backgroundColor = .clear
// LabelC.widthAnchor.constraint(equalToConstant: 150).isActive = true
// LabelC.font = LabelC.font.withSize(18)
// LabelC.textAlignment = .left
LabelC.text = “This is my 3rd label of 12“

** 更新 **

感谢所有评论。

我现在通过向我的填充类添加一个 func 来重新使用通用代码行。

不幸的是,文本字段填充不再有效。

class PaddedTextField: UITextField {

let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5);

override func textRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, padding)
}

override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, padding)
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, padding)
}

func createText(with text: String) -> UITextField {
let txtField = UITextField()
txtField.backgroundColor = .clear
txtField.widthAnchor.constraint(equalToConstant: 250).isActive = true
txtField.layer.borderWidth = 1
txtField.layer.borderColor = UIColor(r: 203, g: 203, b: 203).cgColor
txtField.layer.cornerRadius = 5
txtField.layer.masksToBounds = true
txtField.placeholder = text
txtField.isEnabled = true
return txtField
}
}

因此,这行代码可以在不添加字段填充的情况下运行...

let textFieldA = PaddedTextField().createText(with: "placeholder text...")

...这适用于字段填充,但不能重复使用通用代码行。

let textFieldB = PaddedTextField()
textFieldB.backgroundColor = .clear
textFieldB.widthAnchor.constraint(equalToConstant: 250).isActive = true
textFieldB.layer.borderWidth = 1
textFieldB.layer.borderColor = UIColor(r: 203, g: 203, b: 203).cgColor
textFieldB.layer.cornerRadius = 5
textFieldB.layer.masksToBounds = true
textFieldB.placeholder = "textFieldB placeholder text..."
textFieldB.isEnabled = true

我不确定我的哪些部分有误/不明白。谢谢。

最佳答案

用这些重复的属性创建一个 UILabel 子类可能是最有效和干净的方法。

第二种方法是创建一个工厂

例如:

private class func factoryLabel() -> UILabel
{
let label = UILabel()
label.backgroundColor = .clear
label.widthAnchor.constraint(equalToConstant: 150).isActive = true
label.font = LabelC.font.withSize(18)
label.textAlignment = .left

return label
}

...

let LabelB = myClass.factoryLabel()
LabelB.text = “This is my 2nd label of 12“

这里的例子是一个类函数,你需要把它作为一个静态函数来调用,即用类的名字。


更新

在您的更新中,您并没有完全使用工厂,而是创建了 UITextField 的子类在那个子类中分解一个 UITextField (即分解你的子类)

因为你已经有了拥有工厂的子类并不是真正必要的,所以把你的类改成这样:

class PaddedTextField:UITextField
{
private let padding:UIEdgeInsets = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5);

init(with text:String)
{
super.init(frame:CGRect.zero)
backgroundColor = .clear
widthAnchor.constraint(equalToConstant:250).isActive = true
layer.borderWidth = 1
layer.borderColor = UIColor(r: 203, g: 203, b: 203).cgColor
layer.cornerRadius = 5
layer.masksToBounds = true
placeholder = text
isEnabled = true
}

required init?(coder aDecoder:NSCoder)
{
return nil
}

override func textRect(forBounds bounds:CGRect) -> CGRect
{
return UIEdgeInsetsInsetRect(bounds, padding)
}

override func placeholderRect(forBounds bounds:CGRect) -> CGRect
{
return UIEdgeInsetsInsetRect(bounds, padding)
}

override func editingRect(forBounds bounds:CGRect) -> CGRect
{
return UIEdgeInsetsInsetRect(bounds, padding)
}
}

现在像这样实例化它:

let textFieldA = PaddedTextField(with: "placeholder text...")

关于Swift - 代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45366718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com