在 Swift编程语言中,在Strings部分字符串Mutability中,它说:

You indicate whether a particular String can be modified (or mutated) by assigning it to a variable (in which case it can be modified),or to a constant (in which case it cannot be modified):

并给出示例代码:

var variableString = "Horse"
variableString += " and carriage"
// variableString is Now "Horse and carriage"

let constantString = "Highlander"
constantString += " and another Highlander"
// this reports a compile-time error - a constant string cannot be modified”

这本书在iBooks here中,或在网络浏览器here中.

在下一段中,它声称“字符串是值类型”.

我的问题:这看起来不像我可变的字符串.它看起来像我在Java(或C#,Python和其他)中常用的:具有可变变量绑定的不可变字符串对象.换句话说,有一个对象“马”,然后创建一个新的String对象“马和马车”,并将其设置为相同的变量.而且由于没有办法说明对不可变对象的引用与值类型之间的区别(对吗?),我想知道为什么它们这样描述?这些Swift字符串和Java之间有什么区别吗? (或C#,Python,Objective-C / Nsstring)

以某种方式,在谈论参考类型时,“可变”和“不可变”才有意义.如果您尝试将其扩展为值类型,则所有值类型可以被视为与“不可变”引用类型的功能相同.

例如,考虑一个类型为Int的var.这是可变的吗?有些人可能会说,可以通过分配(=)来更改其可见的“值”.但是,NSNumber和Nsstring的变量也可以相同 – 您可以通过分配给它来更改其可见值.但NSNumber和Nsstring被描述为不可变类.

引用类型真正发生的是分配给它们会导致变量(指针)指向一个新的对象.旧的和新的对象本身都不会“改变”,但由于它指向一个不同的对象,所以你“看到”一个新的值.

当我们说一个类是“可变的”时,我们的意思是它提供了一个API(方法或参考)来实际改变对象的内容.但是我们怎么知道对象已经改变了? (而是它是一个新对象?)这是因为我们可以对同一个对象有另一个引用,并且通过一个引用对对象的更改可以通过另一个引用来看到.但这些属性(指向不同对象,具有多个指向同一对象的指针)本质上仅适用于引用类型.根据定义,值类型不能具有这样的“共享”(除非“值”的一部分是Array中的引用类型),因此,值类型不会发生“可变性”的后果.

所以,如果你做一个包含整数的不变类,它将在操作上等价于Int – 在这两种情况下,更改变量值的唯一方法是将(=)赋值给它.所以,Int也应该被认为是“不变的”.

Swift中的值类型稍微复杂一点,因为它们可以有方法,其中一些可以是变异的.所以如果你可以调用一个值类型的变异方法,它是可变的吗?但是,如果我们考虑将值类型的变异方法称为语法糖,为其分配一个全新的值(无论使用哪种方法将其变异),我们都可以克服这一点.

Swift“可变”字符串是否可变,或者它们是否像Java字符串一样?的更多相关文章

  1. Swift基础语法: 23 - Swift的Trailing闭包, 捕获, 闭包是引用类型

    其使用求余运算符计算最后一位数字并利用digitNames字典获取所映射的字符串.2.字典digitNames下标后跟着一个叹号(!

  2. swift 值类型和引用类型

    1.Struct是值类型,拷贝是值拷贝,Class是引用类型,拷贝是引用拷贝

  3. Swift:什么时候使用结构体和类

    发布于2015年8月14日世界上对swift持续不断的讨论话题中有一个就是什么时候使用结构体什么时候使用类。这个例子对应下面Swift的举例:和之前的打印结果一样:值类型的体验值类型不是一个新的概念,但是对于很多人来说他们觉得这是新的。很多认为“一切皆对象”的语言如Python、JavaScript等也都只有引用类型。Swift对此说“yes”,那也就意味着Array,Dictionary和String都是结构体而不是类。

  4. 何时使用Swift Structs和Classes

    struct在绝大部分Objective-C代码中并不是很常用.我们偶尔以CGRect和CGPoint等方式接触到它们,但很少会自己去写.首先,它们不是很实用.用Objective-C在struct中正确地存储对象的引用的确很难,尤其是使用ARC的时候.很多其他语言干脆没有类似struct的东东.许多语言如同Python和JavaScript一样”万物皆对象”,只有引用类型.如果你是从这类语言转型到Swift的,你可能对struct的概念就更陌生了.等一下!

  5. Swift学习笔记—— 类和结构体

  6. 关于Swift中的值类型(Value Types)与引用类型(Reference Type)

    Swift里面的类型分为两种:●值类型:每个实例都保留了一分独有的数据拷贝。如结构体、枚举和元组。值类型与引用类型的区别在于:值类型和引用类型最基本的区别在于复制之后的结果。引用类型示例代码如下:值类型较引用类型来说,会让你更容易在大量代码中理清状况。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。

  7. Swift面向协议编程初探

    最近有时间,挑了几个今年WWDC中比较感兴趣的Session视频来学习,今天就抽时间整理一下关于Swift2.0中一个比较新的概念面向协议编程。苹果官方那么正式的称Swift是一门支持面向协议编程的语言,难道就是这么简单的内容?而在Swift语言中,协议被赋予了更多的功能和更广阔的使用空间,在Swift2.0中,更为协议增加了扩展功能,使其能够胜任绝大多数情况下数据类型的抽象,所以苹果开始声称Swift是一门支持面向协议编程的语言。

  8. 深入了解下Swift中的Value Type

    Swift中的集合就是这么做的,你也可以自己创建一个这样的类型。~~ByeBye等等你给我讲了这么多貌似没什么用啊错用出躲到你都遗忘了在我们Swift的世界中StringArrayDictionary都是ValueType,那么在他们装了一个AnyObject的是不是一个ValueTypeContainaReferenceType下面我们拿Array距离Array可以看做一个特殊的Dictionary表现形式其实是一样的。

  9. swift 2.0 值类型 和 引用类型

    //2.值类型&引用类型//-----结构体变量属于值类型。相当于copy//------类对象属于引用类型。相当于strongstructPoint{varx:Intvary:Int}varpoint_99=Pointprint//这里的直接赋值,相当于是把point_99拷贝一份,把拷贝的那份给point_100,所以当之后修改point_99的值时,是不会影响point_100的。varpoint_100=point_99point_99.x=100point_99.y=100printclassP

  10. Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy

    viewmode=list我的stackoverflow前言:Swift相对应ObjectiveC来说,它不再需要绝大部分对象继承自NSObject,所以Swift的类型和ObjectiveC的变量类型也不一致。Struct是值类型可以看到,值类型拷贝后的内存是这个样子的再来看看引用类型总结值类型或者引用类型在赋值的时候都是copy,值类型拷贝累实际的内存,而饮用类型只是拷贝了指针,仍然指向最开始的内存区域什么是值类型or引用类型?Class的实例是引用类型Swift方法类型是引用类型其余的都是值类型,像

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部