Create a subclass of UITextField so you can reuse this component across multiple views without have to re implement the drawing code. Expose various properties via @IBDesignable and @IBInspectable and you can have control over color and thickness in the story board. Also - implement a "redraw" on by overriding layoutSubviews so the border will adjust if you are using auto layout and there is an orientation or perhaps constraint based animation. That all said - effectively your subclass could look like this:
import UIKit
class Field: UITextField {
    private let border = CAShapeLayer()
    @IBInspectable var color: UIColor = UIColor.blue {
        didSet {
            border.strokeColor = color.cgColor
        }
    }
    @IBInspectable var thickness: CGFloat = 1.0 {
        didSet {
            border.lineWidth = thickness
        }
    }
    override func draw(_ rect: CGRect) {
        self.borderStyle = .none
        let from = CGPoint(x: 0, y: rect.height)
        let here = CGPoint(x: rect.width, y: rect.height)
        let path = borderPath(start: from, end: here).cgPath
        border.path = path
        border.strokeColor = color.cgColor
        border.lineWidth = thickness
        border.fillColor = nil
        layer.addSublayer(border)
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        let from = CGPoint(x: 0, y: bounds.height)
        let here = CGPoint(x: bounds.width, y: bounds.height)
        border.path = borderPath(start: from, end: here).cgPath
    }
    private func borderPath(start: CGPoint, end: CGPoint) -> UIBezierPath {
        let path = UIBezierPath()
        path.move(to: start)
        path.addLine(to: end)
        return path
    }
}
Then when you add a text field view to your story board - update the class in the Identity Inspector to use this subclass, Field - and then in the attributes inspector, you can set color and thickness.