// First Step override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) Label.text = "" Label.animation(typing: "Bangladesh is small country.", duration: 0.1) } extension UILabel { func animation(typing value: String, duration: Double){ for char in value { self.text?.append(char) RunLoop.current.run(until: Date() + duration) } } } // Second System: override func viewDidLoad() { super.viewDidLoad() Label.animate(newText: "Bangladesh is small country", characterDelay: 0.1) } extension UILabel { func animate(newText: String, characterDelay: TimeInterval) { DispatchQueue.main.async { self.text = "" for (index, character) in newText.enumerated() { DispatchQueue.main.asyncAfter(deadline: .now() + characterDelay * Double(index)) { self.text?.append(character) self.fadeTransition(0.2) } } } } } extension UIView { func fadeTransition(_ duration:CFTimeInterval) { let animation = CATransition() animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) animation.type = CATransitionType.fade animation.duration = duration layer.add(animation, forKey: CATransitionType.fade.rawValue) } }