目录
利用谓语语法和正则表达式,判断字符串是否符合特定格式
//利用谓语语法,判断一个字符串是否是邮箱。
func isValidEmail(testStr: String) -> Bool {
//可以根据自己的需要改成别的正则表达式
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: testStr)
}
isValidEmail(testStr: "213@12.com")//true
如何判断app运行在真机还是模拟器上面
#if (arch(i386) || arch(x86_64)) && os(iOS)
//如果是模拟器,则会运行,真机上面则不会执行
print("模拟器")
#endif
print("正常代码")
OC的respondsToSelector方法
//使用如下方式代替
if let delegate = delegate {//判断是否存在代理
if let theMethod = delegate.theOptionalProtocolMethod? {//判断代理是否实现方法
theMethod()
return
}
}
获得某个date的年月日时分秒等
let date = Date()
//获得当天的日历对象
let calendar = Calendar.current
//获得小时
let hour = calendar.component(.hour, from: date)
//获得分钟
let minutes = calendar.component(.minute, from: date)
给UITextView添加placeholder占位符
//定义了一个全局的常量
let placeholderText = "请输入内容!"
//1.给textview扩展如下方法:
extension UITextView {
func addPlaceholderText(text: String) {
self.text = text
self.textColor = .lightGray
}
}
//2.创建出textview
textView = UITextView(frame: view.frame)
textView.delegate = self
textView.addPlaceholderText(text: placeholderText)
view.addSubview(textView)
//3.在textview的下列代理方法中,实现如下两个方法,添加如下代码
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.textColor == .lightGray {
textView.text = nil
textView.textColor = .black
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if textView.text.isEmpty {
textView.addPlaceholderText(text: placeholderText)
}
}
只需要以上操作,textview就可以跟textfield一样,拥有一个placeholder占位符提示语
格式化输出Int
//方法一:
let str = String(format: "%02d-%03d", 1,2)//01-002
//方法二
let str2 = String(format: "%02d-%03d", arguments: [1,2])//01-002
//方法三
let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2
let str3 = formatter.string(from: 1)//01
搜索指定的文件夹路劲
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
获得app设置中version版本号
let verson = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
print(version)//1.0.1
设置tableview的分割线separator的颜色,宽度等
tableView.separatorColor = .red//分割线颜色
tableView.separatorStyle = .singleLineEtched//分割线样式
// tableView.separatorEffect//效果
tableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)//分割线内边距,都设置为0,则会出现一条宽等于屏幕的完整的分割线
如何安全的使用array,如果下标越界等情况发生时,不会崩溃
//给collection扩展一个下标方法
extension Collection where Indices.Iterator.Element == Index {
subscript (safe index: Index) -> Generator.Element? {
return indices.contains(index) ? self[index] : nil
}
}
//使用
let arr = [1]
arr[safe: 2]//nil,会得到一个nil,而不会崩溃
iOS自带的tableview刷新控件
//创建出刷新控件
let refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "开始刷新")
refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
//添加上去即可
tableView.addSubview(refreshControl)
//实现刷新函数
func refresh(sender: AnyObject) {
//做刷新要做的事情
print("开始刷新")
}
//结束刷新,需要结束的时候调用
refreshControl.endRefreshing()
如何获得一个view的快照,并生成image
extension UIView {
func takeSnapshot() -> UIImage {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)
drawHierarchy(in: self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
}
快速比较,两个date之间的差距,比如相差多少年月日等
extension Date {
//返回相差多少年
func years(from date: Date) -> Int {
return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
}
//返回差多少月
func months(from date: Date) -> Int {
return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
}
//返回差多少周
func weeks(from date: Date) -> Int {
return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
}
//返回差多少天
func days(from date: Date) -> Int {
return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
}
//返回差多少小时
func hours(from date: Date) -> Int {
return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
}
//返回差多少分钟
func minutes(from date: Date) -> Int {
return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
}
//返回差多少秒
func seconds(from date: Date) -> Int {
return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
}
//返回差距的描述
func offset(from date: Date) -> String {
if years(from: date) > 0 { return "(years(from: date))y" }
if months(from: date) > 0 { return "(months(from: date))M" }
if weeks(from: date) > 0 { return "(weeks(from: date))w" }
if days(from: date) > 0 { return "(days(from: date))d" }
if hours(from: date) > 0 { return "(hours(from: date))h" }
if minutes(from: date) > 0 { return "(minutes(from: date))m" }
if seconds(from: date) > 0 { return "(seconds(from: date))s" }
return ""
}
}
//使用
let date1 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date2 = DateComponents(calendar: .current, year: 2015, month: 8, day: 28, hour: 5, minute: 9).date!
let years = date2.years(from: date1) // 0
let months = date2.months(from: date1) // 9
let weeks = date2.weeks(from: date1) // 39
let days = date2.days(from: date1) // 273
let hours = date2.hours(from: date1) // 6,553
let minutes = date2.minutes(from: date1) // 393,180
let seconds = date2.seconds(from: date1) // 23,590,800
let timeOffset = date2.offset(from: date1) // "9M"
let date3 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date4 = DateComponents(calendar: .current, year: 2015, month: 11, day: 28, hour: 5, minute: 9).date!
let timeOffset2 = date4.offset(from: date3) // "1y"
let date5 = DateComponents(calendar: .current, year: 2017, month: 4, day: 28).date!
let now = Date()
let timeOffset3 = now.offset(from: date5) // "1w"
//或者使用date components formatter
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.year,.month,.weekOfYear,.day,.hour,.minute,.second]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = .full
dateComponentsFormatter.string(from: Date(), to: Date(timeIntervalSinceNow: 4000000)) // "1 month"