Swift小技巧(三)

所有小技巧都是基于Swift3

1.實(shí)現(xiàn)tableview滾動(dòng)到底部的功能

//獲得底部的位置
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height-scrollView.bounds.height)
//設(shè)置scrollview顯示的位置
scrollView.setContentOffset(bottomOffset, animated: true)

2.string與nsstring截取字符串的區(qū)別

//string
let str = "my string"
let startIndex = str.index(str.startIndex, offsetBy: 3)
let endIndex = str.index(str.startIndex, offsetBy: 7)
let subStr = str[startIndex...endIndex]//"stain"

//nsstring
let myNSString = str as NSString
myNSString.substringWithRange(NSRange(location: 0, length: 3))

3.如何獲得app的delegate

//AppDelegate繼承自UIApplicationDelegate蜒车,所以需要向下轉(zhuǎn)換一下
let appDelegate = UIApplication.shared.delegate as! AppDelegate
//此時(shí)就可以獲得AppDelegate的屬性了
let window = appDelegate.window

4.獲得app支持的語言

let languages = UserDefaults.standard.object(forKey: "AppleLanguages")
print(languages)//"en"

5.xcode8調(diào)試的時(shí)候懒浮,在控制臺(tái)輸出很多系統(tǒng)打印,如何取消

1.選擇edit scheme...


屏幕快照 2017-05-02 上午9.46.40.png

2.選中run,然后在environment variables中name輸入OS_ACTIVITY_MODE,value輸入disable即可


1

6.如何更好的設(shè)置一個(gè)global的值,比如通知的名稱链韭,路徑,UserDefaults的key等等

建議寫一個(gè)全局的struct煮落,在該結(jié)構(gòu)體內(nèi)部寫上整個(gè)app需要的global的值

struct GlobalKey {
    //通知的key
    struct NotificationKey {
        static let Welcome = Notification.Name("HelloKey")
    }
    //固定的路徑
    struct GlobalPath {
        static let Documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    }
    //服務(wù)器信息
    struct ServerSetting {
        static let ServerIP = "1.1.1.1"
        static let ServerPort = 123
    }
}
//使用
print(GlobalKey.NotificationKey.Welcome)//Name(_rawValue: HelloKey)
print(GlobalKey.ServerSetting.ServerIP)//1.1.1.1
print(GlobalKey.GlobalPath.Documents)//...

7.GCD如何實(shí)現(xiàn)回到主線程異步調(diào)用

DispatchQueue.main.async {
    //code
}

8.如何忽略函數(shù)的返回值敞峭,而不產(chǎn)生警告

func conent() -> Int {
        return 10
    }
//用_代替返回值即可
_ = conent()

9.如何實(shí)現(xiàn)協(xié)議中,某些方法可選擇性的實(shí)現(xiàn)

//必須在協(xié)議前加上@objc
@objc protocol MyProtocol {
    //該方法可以選擇性實(shí)現(xiàn)蝉仇,前面必須加上@objc
    @objc optional func doSomething()
}
class MyClass: MyProtocol {
//協(xié)議的方法可以不實(shí)現(xiàn)
}

10.如何實(shí)現(xiàn)string與date之間的互相轉(zhuǎn)換

/* 首先需要知道dateFormat中旋讹,各個(gè)字母所代表的含義
 G 年代標(biāo)志符
 y 年
 M 月
 d 日
 h 時(shí) 在上午或下午 (1~12)
 H 時(shí) 在一天中 (0~23)
 m 分
 s 秒
 S 毫秒
 E 星期
 D 一年中的第幾天
 F 一月中第幾個(gè)星期幾
 w 一年中第幾個(gè)星期
 W 一月中第幾個(gè)星期
 a 上午 / 下午 標(biāo)記符
 k 時(shí) 在一天中 (1~24)
 K 時(shí) 在上午或下午 (0~11)
 z 時(shí)區(qū)
 */

//string->date
let dateString = "02-03-2017 10:22:30"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
let date = dateFormatter.date(from: dateString)//"Mar 2, 2017, 10:22 AM"
//date->string
let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyy HH:mm:ss"
let dateString = dateFormatter.string(from: date)//"02-05-2017 13:57:25"

11.如何在可變數(shù)組中插入新的元素

var array = ["a","b"]
//添加一個(gè)元素在末尾
array.append("c")
//添加一個(gè)新的數(shù)組在末尾
let new = ["c","d"]
array.append(contentsOf: new)
array += new
//指定位置插入單個(gè)元素
array.insert("e", at: 0)
//指定位置插入數(shù)組
array.insert(contentsOf: new, at: 0)

12.如何使用空合運(yùn)算符(??)

//空合運(yùn)算符的作用:如果可選值為nil,則返回運(yùn)算符后方的值轿衔,否則返回可選值解包后的值
var str: String?
str ?? "1"http://結(jié)果為"1"
str = "c"
str ?? "1"http://結(jié)果為"c"

13.如何獲得本地Bundle和網(wǎng)絡(luò)圖片

//////////////////獲得本地bundle中的圖片//////////////////////
if let filePath = Bundle.main.path(forResource: "imageName", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath) {
    imageView.contentMode = .scaleAspectFit
    imageView.image = image
}

////////////獲得網(wǎng)絡(luò)圖片:方法一////////////////
//首先創(chuàng)建一個(gè)方法沉迹,用于從網(wǎng)絡(luò)下載圖片,以及下載結(jié)束后執(zhí)行閉包
func getDataFromUrl(url: URL, completion: @escaping (_ data: Data?, _  response: URLResponse?, _ error: Error?) -> Void) {
    URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        completion(data, response, error)
    }.resume()
}
//執(zhí)行上方創(chuàng)建的方法害驹,以及實(shí)現(xiàn)閉包內(nèi)容
func downloadImage(url: URL) {
    print("Download Started")
    getDataFromUrl(url: url) { (data, response, error)  in
        guard let data = data, error == nil else { return }
        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")
        DispatchQueue.main.async() { () -> Void in
            self.imageView.image = UIImage(data: data)
        }
    }
}
//最后使用
if let checkedUrl = URL(string: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") {
        imageView.contentMode = .scaleAspectFit
        downloadImage(url: checkedUrl)
    }

//////////////方法二////////////////
//編寫一個(gè)擴(kuò)展鞭呕,里面包含下載的方法
extension UIImageView {
    func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        contentMode = mode
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
            else { return }
            DispatchQueue.main.async() { () -> Void in
                self.image = image
            }
        }.resume()
    }
    func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        guard let url = URL(string: link) else { return }
        downloadedFrom(url: url, contentMode: mode)
    }
}
//使用
imageView.downloadedFrom(link: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png")

14.查看user defaults寫入的plist信息

//寫入了鍵值對:pwd-123456
UserDefaults.standard.set("123456", forKey: "pwd")
for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
            //通過遍歷,可以打印出user defaults的全部內(nèi)容宛官,里面就可以看到新寫入的鍵值對葫松。
            //可以通過這個(gè)方法查看是否寫入成功。
            print("\(key)--\(value)")
        }

15.如何快速清除字符串前后無用的空格和換行

let string = "  \t\t  這是內(nèi)容底洗!  \n \t  \n  "
let newString = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)//"這是內(nèi)容腋么!"
//CharacterSet.whitespacesAndNewlines表示的是空格和換行『ヒ荆可以根據(jù)自己的需要修改成其它的珊擂。

16.如何快速將一個(gè)數(shù)組順序混淆打亂

//給mutablecollection擴(kuò)展一個(gè)方法,該方法的必須要條件是Indices.Iterator.Element == Index
extension MutableCollection where Indices.Iterator.Element == Index {
    //將集合的內(nèi)容打亂混淆
    mutating func shuffle() {
        let c = count
        guard c > 1 else { return }

        for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
            let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
            guard d != 0 else { continue }
            let i = index(firstUnshuffled, offsetBy: d)
            swap(&self[firstUnshuffled], &self[i])
        }
    }
}
extension Sequence {
    //返回一個(gè)打亂后的數(shù)組
    func shuffled() -> [Iterator.Element] {
        var result = Array(self)
        result.shuffle()
        return result
    }
}
//使用
let x = [1, 2, 3].shuffled()
// x == [2, 3, 1]

let fiveStrings = stride(from: 0, through: 100, by: 5).map(String.init).shuffled()
// fiveStrings == ["20", "45", "70", "30", ...]

var numbers = [1, 2, 3, 4]
numbers.shuffle()
// numbers == [3, 2, 1, 4]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末费变,一起剝皮案震驚了整個(gè)濱河市摧扇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胡控,老刑警劉巖扳剿,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昼激,居然都是意外死亡庇绽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門橙困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧掺,“玉大人,你說我怎么就攤上這事凡傅”俦罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哼转。 經(jīng)常有香客問我明未,道長,這世上最難降的妖魔是什么壹蔓? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任趟妥,我火速辦了婚禮,結(jié)果婚禮上佣蓉,老公的妹妹穿的比我還像新娘披摄。我一直安慰自己,他們只是感情好勇凭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布疚膊。 她就那樣靜靜地躺著,像睡著了一般虾标。 火紅的嫁衣襯著肌膚如雪寓盗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天夺巩,我揣著相機(jī)與錄音贞让,去河邊找鬼。 笑死柳譬,一個(gè)胖子當(dāng)著我的面吹牛喳张,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播美澳,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼销部,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了制跟?” 一聲冷哼從身側(cè)響起舅桩,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雨膨,沒想到半個(gè)月后擂涛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聊记,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年撒妈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排监。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狰右,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舆床,到底是詐尸還是另有隱情棋蚌,我是刑警寧澤嫁佳,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站谷暮,受9級(jí)特大地震影響蒿往,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坷备,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一熄浓、第九天 我趴在偏房一處隱蔽的房頂上張望情臭。 院中可真熱鬧省撑,春花似錦、人聲如沸俯在。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跷乐。三九已至肥败,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愕提,已是汗流浹背馒稍。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浅侨,地道東北人纽谒。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像如输,于是被迫代替她去往敵國和親鼓黔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,216評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理不见,服務(wù)發(fā)現(xiàn)澳化,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 一:http://www.reibang.com/p/c94a05e21140 1.OC中的#pragma mar...
    狂奔的胖蝸牛閱讀 984評(píng)論 0 1
  • 在音樂節(jié)上稳吮,旁邊的一個(gè)白凈妹子在方大同唱的時(shí)候一直幫我穩(wěn)住手機(jī)(我肯定不會(huì)主動(dòng)問別人能否幫我做)缎谷,她是自發(fā)的~不過...
    Leonor_Z閱讀 145評(píng)論 0 0
  • 林平之本是一個(gè)衣食無憂的翩翩佳公子。得到祖輩父母的庇佑灶似,從小養(yǎng)尊處優(yōu) 列林。在十九歲之前,他成長得快樂自在喻奥。豈知命運(yùn)如...
    怪鴨帆閱讀 1,954評(píng)論 2 6