精华内容
参与话题
问答
  • swift3.0 协议内方法声明为mutating

    千次阅读 2017-02-14 18:50:56
    将 protocol 的方法声明为 mutating...Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的协议时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutat

    http://www.pdosgk.com/index.php/home/news/show/id/70159.html

    将 protocol 的方法声明为 mutating

    Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的协议时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutating func myMethod()。Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,所以如果你没在协议方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个协议的话,就不能在方法里改变自己的变量了。比如下面的代码

    protocol Vehicle {
        var numberOfWheels: Int {get}
        var color: UIColor {get set}
        mutating func changeColor()
    }
    
    struct MyCar: Vehicle {
        let numberOfWheels = 4
        var color = UIColor.blue
        mutating func changeColor() {
            color = .red
        }
    }

    如果把 protocol 定义中的 mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现协议;如果去掉 mutating 的话,会报错说不能改变结构体成员。这个协议的使用者的忧伤的眼神,相信你能想象得出。

    另外,在使用 class 来实现带有 mutating 的方法的协议时,具体实现的前面是不需要加 mutating 修饰的,因为 class 可以随意更改自己的成员变量。所以说在协议里用 mutating 修饰方法,对于 class 的实现是完全透明,可以当作不存在的。

    class MyFerrari: Vehicle {
        let numberOfWheels = 4
        var color = UIColor.red
        func changeColor() {
            color = .black
        }
    }

    记住结论, 所有协议中的方法都用mutating修饰

    展开全文
  • swiftmutating

    2016-05-05 17:39:22
    mutating 主要用于定义协议接口增加的关键字段 Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。...Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 stru

    mutating 主要用于定义协议接口增加的关键字段

    Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的接口时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutating func myMethod()。Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,所以如果你没在接口方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个接口的话,就不能在方法里改变自己的变量了

    protocol Vehicle{  

    var numberOfWheels: Int {get}  

    var color: UIColor {get set}  

    mutating func changeColor()

    }

    struct MyCar: Vehicle {  

    let numberOfWheels = 4  

    var color = UIColor.blueColor()  

    mutating func changeColor() {  

    color = UIColor.redColor()  

    }}

    如果把 protocol 定义中的 mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现接口;如果去掉 mutating 的话,会报错说不能改变结构体成员。这个接口的使用者的忧伤的眼神,相信你能想象得出。

    另外,在使用 class 来实现带有 mutating 的方法的接口时,具体实现的前面是不需要加mutating 修饰的,因为 class 可以随意更改自己的成员变量。所以说在接口里用 mutating 修饰方法,对于 class 的实现是完全透明,可以当作不存在的。

    ps:本来来自http://swifter.tips/protocol-mutation/


    展开全文
  • Swift_mutating

    2015-10-10 11:55:08
    swift中,enum和struct与C语言中的不同是:在Swift中我们可以给枚举和结构体添加方法,而C语言中不可以 在这些方法中,我们可以任意获取属性的值,但是默认情况下不允许修改属性的值。我们需要添加mutating关键字...

    方法添加 mutating 关键字

    swift中,enumstructC语言中的不同是:在Swift中我们可以给枚举和结构体添加方法,而C语言中不可以
    在这些方法中,我们可以任意获取属性的值,但是默认情况下不允许修改属性的值。我们需要添加mutating关键字,这样就可以对属性进行修改



    示例代码
    在结构体中的方法中添加mutating关键字,实现在方法内部修改属性的值

    struct Point {
    
        var x = 0, y = 0
    
        // 不添加 mutating 关键字,不能在实例方法中修改属性值
        mutating func moveXBy(x: Int, yBy y: Int) {
            self.x += x
            self.y += y
        }
    }
    

    在枚举中的方法中添加mutating关键字,实现在方法内部修改自身的值

    enum ChangeStateSwitch {
    
        case Off, Low, High
    
        // 不添加 mutating 关键字,不能在实例方法中修改属性值
        mutating func next() {
            switch self {
            case .Off:
                self = .Low
            case .Low:
                self = .High
            case .High:
                self = .Off
            }
        }
    }
    


    将protocol的方法声明为mutating

    在声明协议的时候,给协议方法添加mutating关键字,针对结构体和枚举来说,会有很大的帮助,这样,结构体和枚举在这个协议方法中就可以实现修改属性的值了

    protocol MyProtocol {
        mutating func change()
    }
    

    当我们的结构体遵守了协议,实现协议方法的时候,才可以在协议方法中对属性进行修改,否则直接报错

    struct MyCar: MyProtocol {
        var price = 3459234.23
    
        mutating func change() {
            price = 56783.2
        }
    }
    

    对于类来说,协议方法中添加了mutating是无意义的,因为类中的方法本身就可以修改变量

    class Car: MyProtocol {
    
        var price = 8923.2
    
        func change() {
            price = 3243.2
        }
    
    }
    
    Swift_lazy(延迟存储属性)
    展开全文
  • Swiftmutating关键字

    2018-03-05 09:57:43
    Swiftmutating关键字Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用于struct、enum。使用 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,在设计接口的时候,...

    Swift中mutating关键字

    Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用于structenum
    使用 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,在设计接口的时候,也要考虑到使用者程序的扩展性。所以要多考虑使用mutating来修饰方法。


    首先,先定义一个protocol

    protocol ExampleProtocol {
        var simpleDescription: String { get }
        mutating func adjust()
    }
    

    在上面,定义了一个ExampleProtocol,接下来我们写一个class来遵守这个协议

    class SimpleClass: ExampleProtocol {
        var simpleDescription: String = "A very simple class"
        var anotherProperty: Int = 110
        // 在 class 中实现带有mutating方法的接口时,不用mutating进行修饰。因为对于class来说,类的成员变量和方法都是透明的,所以不必使用 mutating 来进行修饰
        func adjust() {
            simpleDescription += " Now 100% adjusted"
        }
    }
    // 打印结果
    var a = SimpleClass()
    a.adjust()
    let aDescription = a.simpleDescription
    

    struct中实现协议ExampleProtocol

    struct SimpleStruct: ExampleProtocol {
        var simpleDescription: String = "A simple structure"
        mutating func adjust() {
            simpleDescription += "(adjusted)"
        }
    }
    

    enum中实现协议ExampleProtocol

    enum SimpleEnum: ExampleProtocol {
        case First, Second, Third
        var simpleDescription: String {
            get {
                switch self {
                case .First:
                    return "first"
                case .Second:
                    return "second"
                case .Third:
                    return "third"
                }
            }
    
            set {
                simpleDescription = newValue
            }
        }
        
        mutating func adjust() {
    
        }
    }
    

    错误信息

    如果将ExampleProtocol中修饰方法的mutating去掉,编译器会报错说没有实现protocol。如果将struct中的mutating去掉,则会报错不能改变结构体的成员。


    转载自:https://www.jianshu.com/p/14cc9d30770a

    展开全文
  • <div><p>Description: This allows structs to implement to protocol and store callbacks in an instance variable (as well as classes, which ignore it). Risk Level: Low - doesn't break class-based ...
  • swift- mutating

    2019-10-03 14:13:42
    struct Stack<Element> { var items = [Element]() func push(_ item:Element){ self.items.append(item) } mutating func pop() -> Element{ ret...
  • swift关键字mutating

    2019-03-20 09:36:21
    学校开课ios开发,人生中第二个ios程序就是苹果开发手册中的ApplePie。按照开发手册写肯定没... mutating func playerGuessed(letter: Character){ guessedLetters.append(letter) if !word.contains(letter) { ...
  • swift protocol mutating

    2015-06-21 10:16:57
    protocol base{   var number:Int{get};  mutating func changeNum();//如果protocol不写mutating那么struct、enum实现此协议将会报错 } struct Derive:base { ...mutating func change
  • swift4.0 关键字 mutating
  • Swift mutating Equatable Hashable 待研究
  • 使用 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量首先,先定义一个protocolprotocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() }在上面,...
  • Swift3.0 mutating关键字

    千次阅读 2017-02-04 16:00:16
    Swift中,包含三种类型(type):structure, enumeration, class 其中structure和enumeration是值类型(value type), class是引用类型(reference type) 但是与Objective-C不同的是,structure和enumeration也...
  • swiftmutating关键字

    千次阅读 2017-02-16 10:22:36
    Swift中,包含三种类型(type): structure,enumeration,class 其中structure和enumeration是值类型(value type),class是引用类型(reference type) 但是与Objective-C不同的是,structure和enumeration也...
  • swift: mutating关键字

    2016-05-17 16:39:31
    在 swift 中,包含三种类型(type): structure , enumeration , class 其中structure和enumeration是值类型( value type ),class是引用类型( reference type ) 但是与objective-c不同的是,structure和...
  • Swiftmutating关键字
  • swiftmutating关键字的使用

    千次阅读 2019-02-12 17:02:09
    Swift中,structure和enumeration是值类型(value type) class是引用类型(reference type)。 默认情况下,实例方法中是不可以修改值类型的属性,使用mutating后可修改属性的值 例如: 在结构体中,有一个实例...
  • swift结构体的mutating

    2017-03-09 14:55:10
    Structures and enumerations are value types. By default, the properties of a value type cannot be modified from within its instance methods. 结构体和枚举都是值类型。默认的,在实例方法内部,值类型的...
  • Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用于struct、enum。使用 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,在设计接口的时候,也要考虑到使用者程序的...
  • mutating的使用(swift2.0)

    2015-12-09 00:02:54
    mutating  例子:为String添加extention 属性lenth 方法,appendString

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

mutating swift