Стремительное расширение например
Я изначально хотел знать, как сделать что-то вроде этого
UIColor.myCustomGreen
чтобы я мог определить свои собственные цвета и использовать их в своем приложении.
Я изучал расширения раньше, и я думал, что, вероятно, смогу использовать их для решения своей проблемы, но я не мог точно вспомнить, как настроить расширения. Поиск в Google на момент написания этой статьи для "расширения Swift" привел к документация,несколько долго уроки, и довольно бесполезное переполнение стека вопрос.
Так что ответы там, но это занимает некоторое копание в документах и учебниках. Я решил написать этот вопрос и следующий ответ, чтобы добавить некоторые лучшие ключевые слова поиска для переполнения стека и обеспечить быстрое обновление о том, как настраиваются расширения.
конкретно я хотел знать:
- где находятся расширения (файл и имя конвенция)?
- что такое синтаксис расширения?
- каковы несколько простых примеров общего использования?
7 ответов:
создание расширения
Добавить новый swift файл с File > New > File... > iOS > Source > Swift File, но вы можете называть их как хотите.
общее соглашение об именовании-это назвать его TypeName+NewFunctionality.Свифт.
Пример 1 -
Double
Двойной+Конверсии.Свифт
import Swift // or Foundation extension Double { func celsiusToFahrenheit() -> Double { return self * 9 / 5 + 32 } func fahrenheitToCelsius() -> Double { return (self - 32) * 5 / 9 } }
использование:
let boilingPointCelsius = 100.0 let boilingPointFarenheit = boilingPointCelsius.celsiusToFahrenheit() print(boilingPointFarenheit) // 212.0
Пример 2.
String
Строка+Ярлыки.Свифт
import Swift // or Foundation extension String { func replace(target: String, withString: String) -> String { return self.replacingOccurrences(of: target, with: withString) } }
использование:
let newString = "the old bike".replace(target: "old", withString: "new") print(newString) // "the new bike"
здесь некоторые более общие
String
расширения.Пример 3 -
UIColor
UIColor+CustomColor.Свифт
import UIKit extension UIColor { class var customGreen: UIColor { let darkGreen = 0x008110 return UIColor.rgb(fromHex: darkGreen) } class func rgb(fromHex: Int) -> UIColor { let red = CGFloat((fromHex & 0xFF0000) >> 16) / 0xFF let green = CGFloat((fromHex & 0x00FF00) >> 8) / 0xFF let blue = CGFloat(fromHex & 0x0000FF) / 0xFF let alpha = CGFloat(1.0) return UIColor(red: red, green: green, blue: blue, alpha: alpha) } }
посмотреть здесь также.
использование:
view.backgroundColor = UIColor.customGreen
Примечания
- как только вы определяете расширение, его можно использовать в любом месте вашего приложения, как и встроенные функции класса.
- если вы не уверены в том, что именно синтаксис функции или свойства должно выглядеть так, можно опции+щелкните аналогичный встроенный метод. Например, когда я опции+щелкал
UIColor.greenColor
Я вижу, что декларацияclass func greenColor() -> UIColor
. Это дает мне хороший ключ к тому, как настроить мой пользовательский метод.- документация Apple для расширений
- в Objective-C расширения известны как категории.
Swift 3.0 пример:
extension UITextField { func useUnderline() { let border = CALayer() let borderWidth = CGFloat(1.0) border.borderColor = UIColor.lightGray.cgColor border.frame = CGRect(origin: CGPoint(x: 0,y :self.frame.size.height - borderWidth), size: CGSize(width: self.frame.size.width, height: self.frame.size.height)) border.borderWidth = borderWidth self.layer.addSublayer(border) self.layer.masksToBounds = true } }
попробуйте это некоторые новые методы расширения:
UIColor
extension UIColor{ //get new color from rgb value class func RGB(_ red:CGFloat , andGreenColor green:CGFloat, andBlueColor blue:CGFloat, withAlpha alpha:CGFloat) -> UIColor { let color = UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha) return color } } //return color from comma separated string of RGB paramater convenience init(rgbString :String, alpha:CGFloat = 1.0){ let arrColor = rgbString.components(separatedBy: ",") let red:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[0])!) let green:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[1])!) let blue:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[2])!) self.init(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha) } //return color from hexadecimal value //let color2 = UIColor(rgbHexaValue: 0xFFFFFFFF) convenience init(rgbHexaValue: Int, alpha: CGFloat = 1.0) { self.init(red: CGFloat((rgbHexaValue >> 16) & 0xFF), green: CGFloat((rgbHexaValue >> 8) & 0xFF), blue: CGFloat(rgbHexaValue & 0xFF), alpha: alpha) } }
UITextField
extension UITextField{ //set cornerRadius func cornerRadius(){ self.layoutIfNeeded() self.layer.cornerRadius = self.frame.height / 2 self.clipsToBounds = true } //set bordercolor func borderColor(){ self.layer.borderColor = TEXTFIELD_BORDER_COLOR.cgColor self.layer.borderWidth = 1.0 } //set borderWidth func borderWidth(size:CGFloat){ self.layer.borderWidth = size } //check textfield is blank func blank() -> Bool{ let strTrimmed = self.text!.trim()//get trimmed string if(strTrimmed.characters.count == 0)//check textfield is nil or not ,if nil then return false { return true } return false } //set begginning space - left space func setLeftPadding(paddingValue:CGFloat) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: paddingValue, height: self.frame.size.height)) self.leftViewMode = .always self.leftView = paddingView } //set end of space func setRightPadding(paddingValue:CGFloat){ let paddingView = UIView(frame: CGRect(x: (self.frame.size.width - paddingValue), y: 0, width: paddingValue, height: self.frame.size.height)) self.rightViewMode = .always self.rightView = paddingView } }
UIFont
extension UIFont{ // Returns a scaled version of UIFont func scaled(scaleFactor: CGFloat) -> UIFont { let newDescriptor = fontDescriptor.withSize(fontDescriptor.pointSize * scaleFactor) return UIFont(descriptor: newDescriptor, size: 0) } }
UIImage
public enum ImageFormat { case PNG case JPEG(CGFloat) } extension UIImage { //convert image to base64 string func toBase64() -> String { var imageData: NSData switch format { case .PNG: imageData = UIImagePNGRepresentation(self)! as NSData case .JPEG(let compression): imageData = UIImageJPEGRepresentation(self, compression)! as NSData } return imageData.base64EncodedString(options: .lineLength64Characters) } //convert string to image class func base64ToImage(toImage strEncodeData: String) -> UIImage { let dataDecoded = NSData(base64Encoded: strEncodeData, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)! let image = UIImage(data: dataDecoded as Data) return image! } //Function for store file/Image into local directory. If image is already on the directory then first remove it and replace new image/File on that location func storedFileIntoLocal(strImageName:String) -> String{ var strPath = "" let documentDirectory1 = NSString.init(string: String.documentDirectory()) let imageName:String = strImageName + ".png" let imagePath = documentDirectory1.appendingPathComponent(imageName) strPath = imagePath let fileManager = FileManager.default let isExist = fileManager.fileExists(atPath: String.init(imagePath)) if(isExist == true) { do { try fileManager.removeItem(atPath: imagePath as String)//removing file if exist // print("Remove success") } catch { print(error) } } let imageData:Data = UIImageJPEGRepresentation(self, 0.5)! do { try imageData.write(to: URL(fileURLWithPath: imagePath as String), options: .atomic) } catch { print(error) strPath = "Failed to cache image data to disk" return strPath } return strPath } //function for resize image func resizeImage(targetSize: CGSize) -> UIImage { let size = self.size let widthRatio = targetSize.width / self.size.width let heightRatio = targetSize.height / self.size.height // Figure out what our orientation is, and use that to form the rectangle var newSize: CGSize if(widthRatio > heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { // newSize = size newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } // This is the rect that we've calculated out and this is what is actually used below let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) // Actually do the resizing to the rect using the ImageContext stuff UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) self.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }
дата
let YYYY_MM_DD_HH_MM_SS_zzzz = "yyyy-MM-dd HH:mm:ss +zzzz" let YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss" let DD_MM_YYYY = "dd-MM-yyyy" let MM_DD_YYYY = "MM-dd-yyyy" let YYYY_DD_MM = "yyyy-dd-MM" let YYYY_MM_DD_T_HH_MM_SS = "yyyy-MM-dd'T'HH:mm:ss" extension Date{ //convert string to date static func convertStringToDate(strDate:String, dateFormate strFormate:String) -> Date{ let dateFormate = DateFormatter() dateFormate.dateFormat = strFormate dateFormate.timeZone = TimeZone.init(abbreviation: "UTC") let dateResult:Date = dateFormate.date(from: strDate)! return dateResult } //Function for old date format to new format from UTC to local static func convertDateUTCToLocal(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() dateFormatterUTC.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!//set UTC timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.local//set localtimeZone dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate:String = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Convert without UTC to local static func convertDateToLocal(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() //set local timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.local dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Convert Date to String func convertDateToString(strDateFormate:String) -> String{ let dateFormatter = DateFormatter() dateFormatter.dateFormat = strDateFormate let strDate = dateFormatter.string(from: self) // dateFormatter = nil return strDate } //Convert local to utc static func convertLocalToUTC(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() dateFormatterUTC.timeZone = NSTimeZone.local as TimeZone!//set UTC timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.init(abbreviation: "UTC")! as TimeZone//set localtimeZone dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate:String = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Comparison two date static func compare(date:Date, compareDate:Date) -> String{ var strDateMessage:String = "" let result:ComparisonResult = date.compare(compareDate) switch result { case .orderedAscending: strDateMessage = "Future Date" break case .orderedDescending: strDateMessage = "Past Date" break case .orderedSame: strDateMessage = "Same Date" break default: strDateMessage = "Error Date" break } return strDateMessage } }
вызов этой функции:
let color1 = UIColor.RGB(100.0, andGreenColor: 200.0, andBlueColor: 300.0, withAlpha: 1.0) let color2 = UIColor.init(rgbHexaValue: 800000, alpha: 1.0) let color3 = UIColor.init(rgbString: ("100.0,200.0,300.0", alpha: 1.0) self.txtOutlet.cornerRadius() self.txtOutlet.borderColor() self.txtOutlet.setLeftPadding(paddingValue: 20.0) self.txtOutlet.setRightPadding(paddingValue: 20.0) let yourScaledFont = self.dependentView.font.scaled(scaleFactor: n as! CGFloat) let base64String = (image?.toBase64(format: ImageFormat.PNG))! let resultImage = UIImage.base64ToImage(toImage: base64String) let path = yourImage.storedFileIntoLocal(strImageName: "imagename")
UIColor+util.Свифт
import UIKit extension UIColor{ class func getCustomBlueColor() -> UIColor { return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) } func getNameofColour() ->String { return "myOrange" } }
использование:
NSLog("\(UIColor.getCustomBlueColor())") let color=UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00); NSLog(color.getNameofColour())
Я надеюсь, что вы видите, что это разница . Одна из функций, начиная с класс func еще один пуск только func . вы можете использовать то, что вам нравится.
Подчеркнутый текст
UITextField
используется в функции
ViewDidLoad()
firstNametext.underlined(0.5)
расширение
extension UITextField { func underlined(_ size:Double){ let border = CALayer() let width = CGFloat(size) border.borderColor = UIColor.red.cgColor border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) border.borderWidth = width self.layer.addSublayer(border) self.layer.masksToBounds = true } } }
один из лучших примеров расширения и удобство инициализатор :
extension UIActivityIndicatorView { convenience init(activityIndicatorStyle: UIActivityIndicatorViewStyle, color: UIColor, placeInTheCenterOf parentView: UIView) { self.init(activityIndicatorStyle: activityIndicatorStyle) center = parentView.center self.color = color parentView.addSubview(self) } }
вы можете использовать его следующим образом :
инициализировать activityIndicator
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge, color: .gray, placeInTheCenterOf: view)
начать анимацию индикатора активности
activityIndicator.startAnimating()
остановить анимацию индикатора активности
activityIndicator.stopAnimating()
Если вы хотите использовать цвет с заданным оттенком, как используется в руководстве бренда: Swift 4.2 + xcode 9.4.1.
extension UIColor { func withTint(tint: CGFloat)->UIColor { var tint = max(tint, 0) tint = min(tint, 1) /* Collect values of sender */ var r : CGFloat = 0 var g : CGFloat = 0 var b : CGFloat = 0 var a : CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) /* Calculate the tint */ r = r+(1-r)*(1-tint) g = g+(1-g)*(1-tint) b = b+(1-b)*(1-tint) a = 1 return UIColor.init(red: r, green: g, blue: b, alpha: a) } }
в коде
let redWithTint = UIColor.red.withTint(tint: 0.4)