Swift 初见

可选值
如果一个值可能为nil,那么这个值就是可选类型,用?标识

    var a1 : String?
    a1 = "可选类型"

可选类型不能直接使用,必须进行强制解包 用!强制解包,对nil强制解包会早成崩溃

    print(a1!)
    print(a1 ?? "强制解包,如果为nil,双引号内是默认值")

if let对可选值进行有值绑定

if let image = UIImage(contentsOfFile: "MyImage.png") {
        // loaded the image successfully
    } else {
        
        // could not load the image
    }

可变与不可变
let var

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

指明类型

let name: String = "我是名字内容"

布尔值:在Swift中的bool值是truefalse,而不是OC中的YES和NO

let onSaleInferred = true
let onSaleExplicit: Bool = false

打印输出:在Swift中的打印输出使用的是print,也可以兼容使用NSlog

    print(10)
    //将值转化为字符串,需要将值写在括号中并在前面加上斜杠”\”
    print("this is \(10)")
    
    //格式化打印
    print(String.init(format: "%@ %@ %.2f", "asd","dd",10.123))
    print("this is \(String.init(format: "%@ %@ %.2f", "asd","dd",10.123))")
    // 也可以使用
    NSLog("this is %@ %.f", "asd","1.12")

字符串

    var emptyString = ""  // 空字符串字面量
    var anotherEmptyString = String()  // 初始化方法
     // 其它的初始化方法…
    
    判断是否为空
    if emptyString.isEmpty {
        print("Nothing to see here")
    }
    
    // 字符串拼接的拼接可以使用”+”来完成
    let string1 = "hello"
    let string2 = " there"
    var welcome = string1 + string2

数组

//创建数组
    var shoppingList: [String] = ["Eggs", "Milk"]
    shoppingList[0...1] = ["Bananas", "Apples"]
    
    //判断数组是否为空
    if shoppingList.isEmpty{
        print("kong")
    }else{
        print("feikong")
    }
    //添加数据
    shoppingList += ["haha"]//添加数据
    //遍历
    for item in shoppingList{
        print(item)
    }
    
    for (index, value) in shoppingList.enumerated() {
        print("Item \(String(index + 1)): \(value)")
    }
    
    // 包含任意类型的数组
    var array2: [Any] = [Any]()
    array2.append(1)
    array2.append(2.0)
    array2.append([3,4])
    array2.append("asdasd")
    array2.append(["key1":"value1","key2":"value2"])
    array2.append(sunClass2)
    
    for iterm in array2{
        print("this is \(iterm)")
    }
    Any:可以表示任何类型,包括函数类型
    AnyObject:可以表示任何类类型的实例

字典

// 字典的创建
    var airports: [String: String] = ["key1": "value1", "key2": "value2"]
    
    //字典中某个value的访问
    let theValue = airports["key1"]
    print(theValue ?? "你打印了一个空字符串")
    
    //增加
    airports["key3"] = "value3"
    //更新
    airports.updateValue("value22222222", forKey: "key2")
    //删除
    airports.removeValue(forKey: "key1")

属性的写法

class Shape {
    var name = "shape"
var string:String{
        set{

        }
        get{
          return "string"
        }
}

}

Swift中的只读属性

var redOnly:String{
get{
    return "asd"
}

}//get 和括号都可以去掉

默认strong nonatomic, 用weak申明

class Shape {
    var name = "shape"
weak var delegate: UITextFieldDelegate? 

}

对外readonly对内readwrite

private(set) var property: Int

定义类变量
通过static定义的类变量无法在子类重写,通过class定义的类变量则可在子类重写。

class Aclass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

解决闭包中循环引用
[unowned 捕获对象]或者 [weak 捕获对象]

__weak typeof(self) weakSelf = self;
    
    self.block = ^{
        
        __strong typeof(self) strongSelf = weakSelf;
        
        [strongSelf doSomething];
        
    };
    self.closure = { [unowned self] in
        
        self.doSomething()
        
    }

类型判断
is关键词
相当于OC的isKindofClass:

单例写法

class singletonClass {
    static let sharedInstance = singletonClass()
    private init() {} // 这就阻止其他对象使用这个类的默认的'()'初始化方法
}

lazy写法

class ClassA {
    lazy var str: String = {
        let str = "Hello"
        print("只在首次访问输出")
        return str
    }()
}

if写法语句里的条件不再需要使用()包裹了。Swift里没有OC的非零即真的说法,判断条件要明确

let number = 23
if number < 10 {
    print("The number is small")
} 

for写法

for index in 1...5 {
    print(index)
}

区间运算符
•闭区间[a,b]-------> a...b•前闭后开区间[a,b)------->a..<b
闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间
半闭区间(a..b)定义一个从a到b但不包括b的区间。 之所以称为半闭区间,是因为该区间包含第一个值而不包括最后的值。
元组遍历字典

let dictionary = ["firstName":"Mango","lastName":"Fang"]
for (key,value) in dictionary{
    print(key+" "+value)
}

SWitch写法,无需breadk
下面这两种写法是等价的。

let character = "a"

switch character{
    case "a":
        print("A")
    break
    case "b":
        print("B")
    break
default: print("character")
let character = "a"

switch character{
    case "a":
        print("A")
    case "b":
        print("B")
default: print("character")

SWitch并列处理

switch some value to consider {
case value 1,value 2:
    statements
}

在OC中,Swtich只支持int类型,char类型作为匹配。

if ([cardName isEqualToString:@"Six"]) {
    [self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
    [self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
    [self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
    [self setValue:9];
} 
switch carName{
    case "Six":
        self.vaule = 6
    case "Seven":
        self.vaule = 7
    case "Eight":
        self.vaule = 8
    case "Night":
        self.vaule = 9   
}

函数(类方法与实例方法)写法
1. 通过func关键词定义函数
2. 返回值在->关键词后标注

class func blackColor() -> UIColor //类方法, 通过 class func 关键词声明
func addSubview(_ view: UIView)//实例方法
如果你调用的方法是没有参数的,调用时也得加上在点方法后也得加上括号
myTableView.layoutIfNeeded()

协议

protocol SampleProtocol 
{
    func someMethod()
}
class AnotherClass: SomeSuperClass, SampleProtocol
{
    func someMethod() {}
}

代理写法 weak

protocol MyDelegate : class {
}

class MyClass {
    weak var delegate : MyDelegate?
}

检测代理更优雅
以前我们要在Objective-C这样检查:

 if (self.dataSource && [self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
        thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
    }

在Swift中,非常的优雅简洁。

if let thisSementTitle = dataSource?.titleFroSegmentAtIndex?(index){
}

在Swift中,protocol变得更加强大,灵活:
class,enum,structure都可以遵守协议。Extension也能遵守协议。利用它,我们不需要继承,也能够让系统的类也遵循我们的协议。例如:

protocol myProtocol {func hello() -> String}
extension String: myProtocol{
        func hello() -> String {
                return "hello world!"
        }
}

扩展(Extension),相对于OC来说没有名字

extension SomeType {
    func hello(){}
}

idAnyObject
在Swift中,没有id类型,Swift用一个名字叫AnyObject的protocol来代表任意类型的对象。

 id myObject = [[UITableViewCell alloc]init];
 var myObject: AnyObject = UITableViewCell()

我们知道id的类型直到运行时才能被确定,如果我们向一个对象发送一条不能响应的消息,就会导致crash。
我们可以利用Swift的语法特性来防止这样的错误:
myObject.method?()
如果myObject没有这个方法,就不会执行,类似检查delegate是否有实现代理方法。
在Swift中,在AnyObject上获取的property都是optional的。
闭包
OC中的block在Swift中无缝地转换为闭包。函数实际上也是一种特殊的闭包。

void (^completionBlock)(NSData *) = ^(NSData *data) {
        
        // ...
        
    }
    let completionBlock: (Data) -> Void = { data in
        
        // ...
        
    }

错误处理
OC写法

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *URL = [NSURL fileURLWithPath:@"/path/to/file"];
NSError *error = nil;
BOOL success = [fileManager removeItemAtURL:URL error:&error];
if (!success) {
        
    NSLog(@"Error: %@", error.domain);
}

Swift写法

let fileManager = FileManager.default
let URL = NSURL.fileURL(withPath: "/path/to/file")
do {

   try fileManager.removeItem(at: URL)
} catch let error as NSError {
        
   print("Error: \(error.domain)")
}

尾随闭包简写
func someFunctionThatTakesAClosure(closure: () -> Void) {
    // 函数体部分
}

//不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure(closure: {
    // 闭包主体部分
})

//使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
    // 闭包主体部分
}

泛型运用

static func httpPost<T:CKKBaseModel>(url: String, pamas: [String: AnyObject]? = nil, success:((T) -> Void)? = nil, successList:((Array<T>) -> Void)? = nil, failure:((String) -> Void)? = nil) {
    }

混编注意
写Swift类可以继承自OC类,但是如果要写一个OC类就不能继承自 Swift 类。
为了在 Objective-C 中可以访问并使用,Swift 类必须是一个 Objective-C 类的子类,或者被标记为@objc。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容