Extension Swift

swift

#1

Всем привет! Предлагаю здесь делиться расширениям базовых классов которые вы часто используете! Я думаю польза от этого будет всем!


#2
extension String {
   func isValidEmail() -> Bool { //валидация email
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
        let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: self)
   }
   //: ### Base64 encoding a string
   func base64Encoded() -> String? {
       if let data = self.data(using: .utf8) {
          return data.base64EncodedString()
       }
       return nil
   }
    //: ### Base64 decoding a string
   func base64Decoded() -> String? {
       if let data = Data(base64Encoded: self) {
          return String(data: data, encoding: .utf8)
       }
       return nil
   }
}

#3

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#4

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#5

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#6

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#7
extension Array {
    func contains<T>(obj: T) -> Bool where T : Equatable {
       return self.filter({$0 as? T == obj}).count > 0
    }
}

extension Dictionary {

    mutating func merge(with dictionary: Dictionary) {
        dictionary.forEach { updateValue($1, forKey: $0) }
    }
  
    func merged(with dictionary: Dictionary) -> Dictionary {
       var dict = self
        dict.merge(with: dictionary)
        return dict
    }
 }

#8
import AudioToolbox

extension UIView {
    
    func shake(withVibtation: Bool = false) {
        let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        animation.duration = 0.6
        animation.values = [-20.0, 20.0, -20.0, 20.0, -10.0, 10.0, -5.0, 5.0, 0.0 ]
        layer.add(animation, forKey: "shake")
        
        if withVibtation {
            if UIDevice.current.userInterfaceIdiom == .phone {
                AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }
    }
}

#9

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#10

Ну в принципе можно, я думаю кто использовать будет сам легко настроит под себя.


#11

extension UIView {

func dropShadow() {
    
    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOpacity = 0.7
    self.layer.shadowOffset = CGSize(width: 1, height: 1)
    self.layer.shadowRadius = 0.7
    
    self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    self.layer.shouldRasterize = true
}

#13
extension UIView {
    func image() -> UIImage {
        UIGraphicsBeginImageContext(frame.size)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return UIImage(cgImage: image!.cgImage!)
    }
}

#14
extension UIApplication {
    func animation(speed: Float) {
        windows.first?.layer.speed = speed
    }
}

#15
extension Double {
    func roundToPlaces(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(self * divisor) / divisor
    }
}
extension String {
    subscript (i: Int) -> Character {
        return self[self.startIndex.advancedBy(i)]
    }
    
    subscript (i: Int) -> String {
        return String(self[i] as Character)
    }
    
    subscript (r: Range<Int>) -> String {
        let start = startIndex.advancedBy(r.startIndex)
        let end = start.advancedBy(r.endIndex - r.startIndex)
        return self [Range(start ..< end)]
    }
}

#17
extension UILabel {
func setHTMLFromString(htmlText: String) {
    let modifiedFont = NSString(format:"<span style=\"color:\(self.textColor.cgColor);font-family: \(self.font!.fontName); font-size: \(self.font!.pointSize)\">%@</span>" as NSString, htmlText) as String
    
    
    //process collection values
    let attrStr = try? NSAttributedString(
        data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue],
        documentAttributes: nil)
    
    self.attributedText = attrStr
}

}


#18

На самом деле, хоть тема и хорошая, но есть вот фреймворк с 500+ экстеншнами для свифта. Не вижу особого смысла его юзать ради 5-10 штук, но посмотреть что там внутри - очень даже рекомендую.


#19

Знаешь, я больше рассчитывал на то что новички посмотрят как можно ту или иную задачу сделать проще чем они делают) я его смотрел, но ты правильно написал, что не все они тебе нужны чтоб целый фреймворк в проект добавлять!


#20

Я так и понял )
Думаю, им будет полезно так же знать и об этом фреймворке, а главное - не юзать его бездумно. Хотя это больше для “продвинутых” новичков было )


#21

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#22

Добрый день!
Раздел можно новый создать, но “Самый простой способ сделать так чтобы…” не имеет какой-то определенной логики, а тут важно ее все таки сохранить. Но можно сделать раздел “расширения” или что-то в этом духе, но опять таки желательно, чтобы с первого раза было понятно что это за раздел и для чего он нужен.