Всем привет! Предлагаю здесь делиться расширениям базовых классов которые вы часто используете! Я думаю польза от этого будет всем!
Extension Swift
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
}
}
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
}
}
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))
}
}
}
}
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
}
extension UIView {
func image() -> UIImage {
UIGraphicsBeginImageContext(frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return UIImage(cgImage: image!.cgImage!)
}
}
extension UIApplication {
func animation(speed: Float) {
windows.first?.layer.speed = speed
}
}
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)]
}
}
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
}
}
На самом деле, хоть тема и хорошая, но есть вот фреймворк с 500+ экстеншнами для свифта. Не вижу особого смысла его юзать ради 5-10 штук, но посмотреть что там внутри - очень даже рекомендую.
Знаешь, я больше рассчитывал на то что новички посмотрят как можно ту или иную задачу сделать проще чем они делают) я его смотрел, но ты правильно написал, что не все они тебе нужны чтоб целый фреймворк в проект добавлять!
Я так и понял )
Думаю, им будет полезно так же знать и об этом фреймворке, а главное - не юзать его бездумно. Хотя это больше для “продвинутых” новичков было )
На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.
Добрый день!
Раздел можно новый создать, но “Самый простой способ сделать так чтобы…” не имеет какой-то определенной логики, а тут важно ее все таки сохранить. Но можно сделать раздел “расширения” или что-то в этом духе, но опять таки желательно, чтобы с первого раза было понятно что это за раздел и для чего он нужен.