美文网首页iOS Developer
Swift3.0 Self和self的区别

Swift3.0 Self和self的区别

作者: brycegao | 来源:发表于2017-01-17 22:20 被阅读0次

    相信大家都知道self关键字的作用, 但你知道Swift还有个Self关键字吗?
    Self关键字只能用在类里, 作为函数返回值类型, 表示当前类。


    类定义.png

    这段代码里有self和Self, self指向类自身;Self只能作为函数关键字, setValue函数的返回值是ClassA类型。
    我们看到有个warning, 就是setValue函数的返回值没有被使用; 这时可以用注解@discardableResult解决。


    注解.png

    PS: Self关键字常常和@discardableResult配对使用。
    <pre>var objA: ClassA? = ClassA(a: 1, b: 2)
    var objB = objA?.setValueA(param: 3)
    print("objA a: (objB!.a)")
    objB = nil
    objA = nil</pre> Swift的类是引用传递, 上面的objA和objB指向同一个对象, 即引用计数为2, 将2者都设置为nil后立即执行析构函数deinit。
    日志:
    objA a: 3
    ClassA deinit

    参考上面类的写法,编写一个结构体,但结构体不支持Self关键字!
    <pre>struct StructA {
    var a: Int
    var b: Int
    init(a: Int, b: Int) {
    self.a = a
    self.b = b
    }
    @discardableResult
    mutating func setValueA(param: Int) -> StructA {
    self.a = param
    return self
    }
    }
    var structA = StructA(a: 1, b: 2)
    var structB = structA.setValueA(param: 3)
    print("structA a: (structA.a), structB a: (structB.a)")
    structB.a = 4
    print("after set 4, structA a: (structA.a), structB a: (structB.a)")
    </pre>结构体是值传递, setValueA会新生成一个相同的实例。
    日志:
    structA a: 3, structB a: 3
    after set 4, structA a: 3, structB a: 4

    声明一个枚举说明值传递。
    <pre> enum EnumA: Int {
    case Monday
    case Tuesday
    }
    extension EnumA {
    func getEnum(a: Int) -> EnumA {
    switch a {
    case 1:
    return .Monday
    case 2:
    return .Tuesday
    default:
    return self
    }
    }
    }
    var enumA: EnumA = .Tuesday
    var enumB = enumA.getEnum(a: 0)
    print("enumA: (enumA.rawValue), enumB:(enumB.rawValue)")
    enumB = .Monday
    print("after set monday, enumA: (enumA.rawValue), enumB:(enumB.rawValue)")</pre>
    输出:
    enumA: 1, enumB:1
    after set monday, enumA: 1, enumB:0

    相关文章

      网友评论

        本文标题:Swift3.0 Self和self的区别

        本文链接:https://www.haomeiwen.com/subject/wfkvbttx.html