You can use the active label frame work available i the github, as I use the same for achieving my goal and it is working fine 
https://github.com/optonaut/ActiveLabel.swift
Example
func setupAgreement() {
        let customType1 = ActiveType.custom(pattern: "\\sterms of service\\b") //Looks for "are"
        let customType2 = ActiveType.custom(pattern: "\\sprivacy policy\\b") //Looks for "it"
        let customType3 = ActiveType.custom(pattern: "\\scookie use\\b") //Looks for "supports"
        userAgreementLabel.enabledTypes.append(customType1)
        userAgreementLabel.enabledTypes.append(customType2)
        userAgreementLabel.enabledTypes.append(customType3)
        userAgreementLabel.customize { (label) in
            label.text = "UserAgreement".localized
            label.numberOfLines = 0
            label.lineSpacing = 4
            label.textColor = UIColor(red: 0 / 255, green: 0 / 255, blue: 0 / 255, alpha: 1)
            //Custom types
            label.customColor[customType1] = Constant.AppColor.blueColor
            label.customSelectedColor[customType1] = Constant.AppColor.blueColor
            label.customColor[customType2] = Constant.AppColor.blueColor
            label.customSelectedColor[customType2] = Constant.AppColor.blueColor
            label.customColor[customType3] = Constant.AppColor.blueColor
            label.customSelectedColor[customType3] = Constant.AppColor.blueColor
            label.configureLinkAttribute = { (type, attributes, isSelected) in
                var atts = attributes
                switch type {
                case customType1:
                    atts[NSFontAttributeName] = UIFont(name: self.userAgreementLabel.font.fontName, size: 15.0)
                case customType2:
                    atts[NSFontAttributeName] = UIFont(name: self.userAgreementLabel.font.fontName, size: 15.0)
                case customType3:
                    atts[NSFontAttributeName] = UIFont(name: self.userAgreementLabel.font.fontName, size: 15.0)
                default: ()
                }
                return atts
            }
            label.handleCustomTap(for: customType1, handler: { (value) in
                self.load(cms: .terms)
            })
            label.handleCustomTap(for: customType2, handler: { (value) in
                 self.load(cms: .privacy)
            })
            label.handleCustomTap(for: customType3, handler: { (value) in
                self.load(cms: .cookie)
            })
        }
    }
    //  func navigateToWebView() {
    //      let controller = self.storyboard?.instantiateViewController(withIdentifier: Constant.StoryBoardIdentifier.webViewController)
    //      self.present(controller!, animated: true, completion: nil)
    //      
    //  }
    func load(cms: CMS) -> Void {
        let cmsController: CMSViewController = UIStoryboard(storyboard: .setting).initVC()
        cmsController.cms = cms
        show(cmsController, sender: cmsController.classForCoder)
    }