• Swift Self关键字的用法

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


    类定义.png


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


    注解.png

    PS: Self关键字常常和@discardableResult配对使用。

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

    参考上面类的写法,编写一个结构体,但结构体不支持Self关键字! 

    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)")
    结构体是值传递, setValueA会新生成一个相同的实例。
    日志:
    structA a: 3, structB a: 3
    after set 4, structA a: 3, structB a: 4

    声明一个枚举说明值传递。

     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)")

    输出:
    enumA: 1, enumB:1
    after set monday, enumA: 1, enumB:0

    展开全文
  • swift - 类型中的self

    2016-04-27 15:27:54
    swift中,关键字表示类型本身 。 (self) 意义 : 消除局部和类型全局的歧义。 class Counter{ var count = 0  func increment(){  self.count++ } }

    swift中,关键字表示类型本身 。 (self

    意义 : 消除局部和类型全局的歧义。


    class Counter{

    var count = 0 

    func increment(){

     self.count++

    }

    }

    展开全文
  • struct 服务器经验倍数 { ...请问一下在这段代码中最后的那个self,我百度查了一下,self是代表实例本身,在我这段代码中代表的就是“人民币玩家”,为什么我把self改成“人民币玩家”后是不行的呢?
  • Swift 中.self和 type(of:)

    2020-05-10 12:36:01
    代码基于:swift 4.0 在一个类中,可以通过 customClass.self 取出不带命名空间的类名。 print(self) // <testOne.ViewController: 0x1033094f0> print(self.description) // <testOne.ViewController: 0...

    代码基于:swift 4.0

    1. 在一个类中,可以通过 customClass.self 取出不带命名空间的类名。
    print(self)  // <testOne.ViewController: 0x1033094f0>
    print(self.description)  // <testOne.ViewController: 0x101d10350>
    print(ViewController.self)  // ViewController
    po type(of: self) // testOne.ViewController
    print(type(of: self)) // ViewController 
    
    1. type(of:)得到是类型
    let count: Int = 5
    printInfo(count)
    // '5' of type 'Int'
    
    展开全文
  • swift中的self属性

    2017-03-09 13:45:47
    Every instance of a type has an implicit property called self, which is exactly equivalent to the instance itself. You use the self property to refer to the current instance within its own instance ...

    这里写图片描述
    Every instance of a type has an implicit property called self, which is exactly equivalent to the instance itself. You use the self property to refer to the current instance within its own instance methods.
    每个类型的实例都有一个隐式的属性self,它实际上相当于实例它自己。以应用self属性在它的实例方法中引用当前的实例。
    注意:是在实例方法中引用它自己。
    因此上边的方法也可以这样写:
    这里写图片描述
    In practice, you don’t need to write self in your code very often. If you don’t explicitly write self, Swift assumes that you are referring to a property or method of the current instance whenever you use a known property or method name within a method. This assumption is demonstrated by the use of count (rather than self.count) inside the three instance methods for Counter.
    实际上,你并不需要经常在你的代码中写self。如果你不显示的写self,swift假定你正在引用的是当前实例的属性或者方法,无论你什么时候应用已知的属性或者方法。
    The main exception to this rule occurs when a parameter name for an instance method has the same name as a property of that instance. In this situation, the parameter name takes precedence, and it becomes necessary to refer to the property in a more qualified way. You use the self property to distinguish between the parameter name and the property name.
    设置self属性的主要目的是为了当方法中的参数和实例的属性有相同名字时使用。在这种情况下,参数优先,用一种更加合理的方式来引用属性时非常必要的。你应用self来区分参数名和属性名。
    这里写图片描述

    展开全文
  • swift中闭包 OC中Block 解决循环引用 OC中全局宏定义 #define WS(weakSelf) __weak __typeof(&amp;*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ ...

    swift中闭包 OC中Block 解决循环引用

    OC中全局宏定义

    #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;
    
    用法如下:
    
    WS(weakself)
    
    [self.tableView addHeaderWithCallback:^{
    
    [weakself requestMemberList];
    
    }];

    swift 在比闭包 中使用 weakSelf

    weak var weakSelf = self
    demo4 {
        // 使用?的好处 就是一旦 self 被释放,就什么也不做
        weakSelf?.view.backgroundColor = UIColor.redColor()
    }

    直接添加[weak self]

    HYHttpTool.post(url: urlString, param: ["appid":WXAPPID,"secret":WXSECRET,"code":code,"grant_type":"authorization_code",]) { [weak self] (response, result) in
      self?.
    }
    
    class func post(url: String?, param: Parameters, complete: @escaping (HTTPURLResponse?, Result<Any>) -> Void ) -> Void {
    
      // 如果发过来的链接长度为空,则直接返回,不做任何反应
      guard let urlString = url, strlen(url) > 0 else {
        return
      }
    
      Alamofire.request(urlString, method: .post, parameters: param).responseJSON { (response) in
        complete(response.response, response.result)
      }
    }

    swift 中一个类可以嵌套定义另外类,新增加的类只能被当前类使用

    在 swift 中,要解除闭包的 循环引用,可以在闭包定义中使用 [unowned self] 或者 [weak self],其中:

    [unowned self] 类似与 OC 中的 unsafe_unretained,如果对象被释放,仍然保留一个 无效引用,不是可选项

    [weak self] 类似与 OC 中的 __weak,如果对象被释放,自动指向 nil,更安全

    [weak self] 时时监控性能较差,[unowned self]可能导致野指针错误,如果能够确定对象不会被释放,尽量使用 unowned

    懒加载的闭包

    lazy var printName: ()->() = { [unowned self] in
      print(self.name)
    }

    下面这句不会发生发生循环引用因为执行完就会消失

    lazy var title: String = {
    
      print(self.name)
      return "Mr. \(self.name)"
    }()
    展开全文
  • class UIViewSpringAnimator: SwipeAnimator {    // 动画完成的闭包  var completion:((Bool) -> Void)?    func addCompletion(completion: @escaping (Bool) -> Void) {
  • Swift相比于oc有很多方便的新特性。今天我们来介绍下Swift中的默认参数(default parameter)和可变长参数(variable parametric)。 这篇文章刚起笔的时候的题目其实是这样的:”Swift可选参数带来的便利”,组织了...
  • swift - self的弱引用

    2019-06-21 10:21:53
    1. weak var weakSelf = self   2. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {[weak self] in self?.v.showAppLoadView(deadTime: deadTime, co...
  • swift 中使用weak self

    2015-10-20 16:03:54
    request.responseString(encoding: NSUTF8StringEncoding) {[weak self] (res) -> Void in if let strongSelf = self { //do something... } } weak var weakSelf = self request.responseString(encod
  • weak 一般我们用来修饰delegate ,block中使用 __weak typeof(self) weakSelf = self; 这两者都是为了避免产生循环引用 循环引用的产生(如): @class Dog; @interface Person : NSObject ///人有一条宠物狗 @...
  • Weak-Strong Dance In Swift——如何在 Swift 中优雅的处理闭包导致的循环引用Objective-C 作为一门资历很老的语言,添加了 Block 这个特性后深受广大 iOS 开发者的喜爱。在 Swift 中,对应的概念叫做 Closure,即...
  • 类(OC),只好自己研究下了,写了一个获取类名的扩展名,后来发现有个.self的方法,也尝试了下哈,看下图 print(UIScreenEdgePanGestureRecognizer().ClassName) print(UIScreenEdgePanGestureRecognizer.self) ...
  • class WangMuMu {var name: String /*2.*/ /* 即使按照 1 里面写的来做依然是不行的 ... 这是因为Swift必须保证当前类和子类都能相应init这个方法 */required init() { name = "qq"}//构建一个Self类型对象
  • ReactiveCocoa5.0 &ReactiveSwift &Reactive.Swift (Base)理解
  • swift,weakself
  • 从OC到swift的一些总结

    2016-08-14 19:44:07
    最近工作不是很忙,我花了两个星期的时间学习了一些swift。虽然swift出来快两年了,但是我一直没有去学习。近来听好多朋友说,他们已经开始用swift开发了,我决定学习一下swift基础的东西,在这里列出我一些学习总结...
  • Swift weakSelf写法

    2016-07-26 16:41:29
    Swift,weakSelf
  •  联系人:石虎 QQ:1224614774 昵称: 嗡嘛呢叭咪哄  QQ群:807236138 群称: iOS 技术交流学习群     一、self和super区别 ...- self调用自己方法,super调用父类...- self class】和【super class】输出是...
  • swift:strongSelf

    2016-08-05 14:24:01
    swift:strongSelf
1 2 3 4 5 ... 20
收藏数 39,598
精华内容 15,839
热门标签