1.利用谓语语法和正则表达式,判断字符串是否符合特定格式
//利用谓语语法,判断一个字符串是否是邮箱。
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: "[email protected]")//true
2.如何判断app运行在真机还是模拟器上面
#if (arch(i386) || arch(x86_64)) && os(iOS)
//如果是模拟器,则会运行,真机上面则不会执行
print("模拟器")
#endif
print("正常代码")
3.OC中的 | 在,swift中如何使用
//oc中,|的使用,如下所示
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
addSubview(view)
view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
//而在swift中,应该这样使用
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
4.用什么方法实现OC的respondsToSelector方法
//使用如下方式代替
if let delegate = delegate {//判断是否存在代理
if let theMethod = delegate.theOptionalProtocolMethod? {//判断代理是否实现方法
theMethod()
return
}
}
5.如何将路径等转换编码方式
let originalString = "test/test"
//.urlHostAllowed可以换成需要的转换类型
var escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString)//Optional("test%2Ftest")
6.如何快速的获得某个date的年月日时分秒等
let date = Date()
//获得当天的日历对象
let calendar = Calendar.current
//获得小时
let hour = calendar.component(.hour, from: date)
//获得分钟
let minutes = calendar.component(.minute, from: date)
7.如何给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占位符提示语
8.格式化输出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
9.获得字典的key数组
let dict = ["a":1,"b":2]
let keys = Array(dict.keys)
keys.map { print($0) }//打印key
//如果是nsdictionary,使用alleys即可
let keys = dict.allKeys
10.搜索指定的文件夹路劲
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
11.获得app设置中version版本号
比如在设置中,我们设置的如图:
let verson = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
print(version)//1.0.1
12.设置tableview的分割线separator的颜色,宽度等
tableView.separatorColor = .red//分割线颜色
tableView.separatorStyle = .singleLineEtched//分割线样式
// tableView.separatorEffect//效果
tableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)//分割线内边距,都设置为0,则会出现一条宽等于屏幕的完整的分割线
13.如何安全的使用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,而不会崩溃
14.如何使用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()
15.如何快速实现,键盘弹起,view跟着上移,键盘消失,恢复原位
//添加一个监听,监听键盘的弹起
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
//监听键盘的消失
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
//上移页面
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y = -150 // Move view 150 points upward
}
//恢复
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y = 0 // Move view to original position
}
16.如何获得一个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
}
}
17.如何设置导航条背景、字体颜色,tabbar背景、字体颜色
//Navigation Bar:
navigationController?.navigationBar.barTintColor = UIColor.green
//Navigation Bar Text:
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]
//Tab Bar:
tabBarController?.tabBar.barTintColor = UIColor.brown
//Tab Bar Text:
tabBarController?.tabBar.tintColor = UIColor.yellow
18.如何删除array已知元素
//扩展一个方法
extension Array where Element: Equatable {
//删除匹配到的第一个元素
mutating func remove(object: Element) {
if let index = index(of: object) {
remove(at: index)
}
}
}
19.快速比较,两个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"