let tempStr: String = "hello world"
// String.Index
let index = initial.index(initial.startIndex, offsetBy: 1)
tempStr.substring(to : index)
注釋:String的截取索引類型為String.Index
let tempStr: String = "hello world"
let nsstring: NSString = tempStr as NSString
nsstring.substring(to : 1)
注釋:NSString的截取索引類型為Int
字符串轉(zhuǎn)為URL
let urlStr = "http://192.168.12.146:8080/download/個(gè)人簡(jiǎn)歷.pdf"
let url:URL = URL(string: urlStr.addingPercentEncoding(withAllowedCharacters: CharacterSet(charactersIn: "`#%^{}\"[]|\\<>").inverted)!)!
swift命令行模式
bogon:~ UltraPower$ swift
Welcome to Apple Swift version 3.1 (swiftlang-802.0.48 clang-802.0.48). Type :help for assistance.
1> print("hello world")
hello world
2> :quit
swift循環(huán)引用
import UIKit
class ViewController: UIViewController {
var a: (() -> ())?
override func viewDidLoad() {
super.viewDidLoad()
//block 中如果出現(xiàn) self. 要特別小心!
// "循環(huán)"引用,單方向的引用是不會(huì)產(chǎn)生循環(huán)引用的
// - 只是閉包對(duì)self 進(jìn)行了copy
// - 同時(shí)需要self對(duì)閉包引用
//*******解除循環(huán)引用
// 方法一:用oc的方法
// 細(xì)節(jié)1:用var不用let丐吓,weak只能修飾var 不能 修飾 let
// 'weak' must be a mutable variable, because it may change at runtime
// weak可能會(huì)在運(yùn)行時(shí)被修改 -> 指向的對(duì)象一旦被釋放孽亲,會(huì)自動(dòng)設(shè)置為nil
weak var weakSelf = self;
loadData {
// 細(xì)節(jié)2
// 解包有兩種方式
// ? 可選解包 如果self已經(jīng)被釋放羡棵,不會(huì)向?qū)ο蟀l(fā)送 view 的消息腮郊,更安全
// ! 強(qiáng)行解包 如果self已經(jīng)被釋放,強(qiáng)行解包會(huì)導(dǎo)致崩潰
// Expression implicitly coerced from 'UIView?' to Any
/*
weakSelf?.view 只是單純的發(fā)送消息,不參與計(jì)算
強(qiáng)行解包归斤,因?yàn)樾枰?jì)算,可選項(xiàng)不能直接參與計(jì)算
*/
print(weakSelf?.view);
}
//方法2 - swift的推薦方法
//[weak self] 表示 () 中的所有 self 都為弱引用
loadData { [weak self] in
print(self?.view as Any);
}
// 方法3 - swift的另一種方法刁岸,知道就好脏里,不安全
// [unowned self] 表示 () 中的所有 self 都為assign, 不會(huì)強(qiáng)引用虹曙,如果對(duì)象釋放迫横,指針地址依然存在
// 如果對(duì)象釋放番舆, 會(huì)出現(xiàn)野指針的現(xiàn)象
loadData { [unowned self] in
print(self.view);
}
}
func loadData(bibao: @escaping () -> ()) {
// 使用屬性記錄閉包 -> self 對(duì)閉包引用
// 在閉包中使用閉包需要使用逃逸閉包@escaping
a = bibao;
//異步
DispatchQueue.global().async {
print("1111");
Thread.sleep(forTimeInterval: 2);
DispatchQueue.main.async(execute: {
print("2222");
bibao();
})
}
}
deinit {
print("qqqqq");
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}