Swift的一些特性_1

转眼间,Swift 4都出来快半年了,距离当初Swift开源也2年多了。正好最近工作比较空闲,就整理一下一些我觉得Swift比较有意思的特性:

PS:以下代码是在Xcode9.0中build成功的,Swift版本是4.0,在终端输入xcrun swift -version则会显示现在xcode的swift版本

  • 函数是一个对象
  • 类属性

函数是一个对象

在Swift中,函数是一个对象,函数本身是可以作为传参或者返回值的,而且函数是可以赋值,如下图

func test() {

    var result:Int
    var matchfunc:(Int, Int) -> Int = addNum;

    result = matchfunc(2, 10);

    print(result) //显示 12

    matchfunc = mulNum;

    result = matchfunc(2, 10);

    print(result); //显示 20
}

//相加函数
func mulNum(a:Int, b:Int) -> Int {
    return a * b;
}

//相乘函数
func addNum(a:Int , b:Int) -> Int {

    return a+b;
}

//函数的返回值是一个函数
func makeIncrementer() -> ((Int) -> Int) {

    func addOne(number: Int) -> Int {
        return 1 + number

    }

    return addOne
}

可以看到,在一个函数中,是可以声明一个”函数类型”的变量的,跟block有点像,实际上,函数本身就是特殊的Block –《The Swift Programming Language》。

PS:函数可以作为一个属性,但这并不意味着函数都是属性,比如直接在类T中写一个方法,在VC中并不能改变这个,如下:

var tes:Test = Test();

tes.test();//执行方法 √

var matchfunc:() -> () = test; //函数作为变量赋值 √

tes.test = test; //error : Cannot assign to property: 'test' is a method

函数跟方法的区别在于: 类中的方法和一般的函数有一个重要的区别,函数的参数名只在函数内部使用,但是方法的参数名需要在调用的时候显式说明(除了第一个参数),如图:

class Test: NSObject {

    override init() {

        //类的属性需要有init方法给初始值
        func tttt() {
            print("tttt");
        }

        //在其他方法中也可以这样赋值,可以看做就是一个普通的block属性
        self.testFunc = tttt;
    }

    var testFunc:() -> (); // 函数作为对象的属性,可以被修改(当执行的时候, xx.testFunc() )

    //普通方法
    func test() {

        let result:Int = 100;

        print(result);
    }
}

——————————————–——————

类属性

类属性其实并不算是Swift的一个特性,在Objective-C里面其实也是存在的,但一是出现的比较晚;二是在OC中类属性给人的感觉其实更像是用单例的一个应用类型,总感觉跟类本身的关系其实没那么的紧密。

SWift中的类属性声明,如下:

import UIKit

class Test: NSObject {

    static var courseCount : Int = 0 //类属性 Test.courseCount这样使用
}

所以使用的时候就可以直接用 XXX.xx 这样赋值和使用,因为类属性是static的,所以需要自己手动去管理内存,在使用完了之后记得要赋nil;

在Objective-C中,类属性的使用跟Swift没什么不同,也是通过 XXX.xx 这样的方式来获取和赋值,不同的地方在于声明;

Test.h 头文件声明

#import <Foundation/Foundation.h>

@interface Test : NSObject

@property (strong, nonatomic, class) NSString *testStr;

@end

Test.m 方法实现

#import "Test.h"

static NSString *_testStr;

@implementation Test

+(void)setTestStr:(NSString *)testStr {

    _testStr = testStr;
}

+(NSString *)testStr {

    return _testStr;
}

@end

可以看到,在OC中,点语法其实是执行了getter和setter方法,而且类属性居然还需要我们手动去使用再构建一个static来管理,类属性这个特性其实只是把setter和getter方法换了一个声明方式而已

上面给出的 Test.h 完全可以用下面的代码来代替

#import <Foundation/Foundation.h>

@interface Test : NSObject

//@property (strong, nonatomic, class) NSString *testStr;

+(void)setTestStr:(NSString *)testStr;
+(NSString *)testStr;

@end

所以说类属性这个特性在OC中特别容易令人混淆,对于代码的可读性来说其实是起到反作用的那么一个效果,当然这个特性也不是不能用,只是个人建议在OC中还是用类方法来做对应的效果,就不要用这么个特性了,会降低代码的可读性。。。

而在Swift中,类属性的声明相当明了,相当于在类的{}里面的static属性就能直接通过 XXX.xx 来使用了,就很直观,所以我这里是直接把类属性当做是Swift中一个比较有意思的特性的。

猜你喜欢

转载自blog.csdn.net/u1031/article/details/78404790
今日推荐