来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."
任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.
在Objective-C中,可以通过以下方式进行深度复制:
Foo *foo = [[Foo alloc] init];
Foo *foo2 = foo.copy;
Run Code Online (Sandbox Code Playgroud)
如何在Swift中进行深层复制?
我刚刚阅读了关于deinitializers的Swift文档,发现它们只存在于类中.所以我只是想知道为什么Swift中的结构没有deinitializers?
问题:基于以下信息和讨论:inout参数是通过引用传递还是通过拷入拷出?
基于以下SO线程,通过引用传递inout关键字标记的函数参数:
我们注意到最顶层的两个线程是 Swift 2.0 之前的;我在 SO 上找不到关于该主题的任何更新的讨论(除了有点相关的第三个线程链接)。
但是,根据 Apple 的文档(据我所知),由inout关键字标记的函数参数是通过copy-in copy-out(或按值调用结果)传递的
传入传出参数如下:
当函数被调用时,参数的值被复制。在函数体中,副本被修改。当函数返回时,副本的值被分配给原始参数。此行为称为拷入拷出或按值结果调用。...
... 您可以通过将 inout 关键字放在其参数定义的开头来编写输入输出参数。一个输入输出参数有一个传入函数的值,被函数修改,然后传回函数外来替换原来的值。...
现在我自己的例子试图调查这个:
struct MyStruct {
private var myInt: Int
mutating func increaseMyInt() {
myInt++
}
func …Run Code Online (Sandbox Code Playgroud) 我是Swift的新手.我创建了一个类(例如):
class Fraction{
var a: Int
init(a:Int){
self.a = a
}
func toString() -> String{
return "\(self.a)"
}
}
Run Code Online (Sandbox Code Playgroud)
我还在其他类函数中构建了一个:
class func A_plusplus(f:Fraction){
f.a++
}
Run Code Online (Sandbox Code Playgroud)
然后在执行课上我写道:
var object = Fraction(a:10)
print("before run func = " + object.toString())
XXXclass.A_plusplus(object)
print("after ran func =" + object.toString() )
Run Code Online (Sandbox Code Playgroud)
所以控制台输出是
在运行func = 10之前; 在运行func = 11之后
问题是如何发送"对象"的副本以保持其值等于10
如果函数总是按引用传递,为什么我们仍然需要关键字: "inout"
什么区别A_plusplus(&object)//[if I make the parameter to be a inout parameter]和A_plusplus(object)
一般来说,我不想使用
struct.虽然这将完全解决我的问题,但我很少通过值传递.所以我不希望程序的复制过程减慢用户手机的速度:(似乎符合
NSCopying协议是一个很好的选择.但我不知道如何实现该功能:func copyWithZone(zone: NSZone)-> AnyObject?正确
我可能错过了关于swift的重要信息.我有一个包含键/快速数组对的映射.我更改了数组,地图中的数组没有改变.有人可以解释发生了什么吗?谢谢!
var map = [String:[String]]()
var list = [String]()
map["list"] = list //output: "["list": []]\n"
print(map)
list.append("test")
print(list) //output: "["test"]\n"
print(map) //output: "["list": []]\n"
Run Code Online (Sandbox Code Playgroud) 我终于要从 Objective-C 切换到 Swift。我正在为我的客户创建一个视图布局系统,使他们的应用程序在布局上更加灵活,而不使用自动布局,因为他们想要远程设计他们的屏幕,而自动布局对他们来说太复杂了。我试图使用它来做这个structs,protocols但我发现它很笨拙,所以我怀疑我没有以正确的方式思考它。
对于类,结构如下:
class ViewModel {
var frame: CGRect = .zero
}
class ViewGroupModel: ViewModel {
var weight: Int = 1
var children:[ViewModel] = [ViewModel]()
}
class HorizontalViewGroupModel: ViewGroupModel {
}
class VerticalViewGroupModel: ViewGroupModel {
}
Run Code Online (Sandbox Code Playgroud)
我试图通过定义一个ViewModel协议和一个ViewGroupModel协议来处理它,但我发现它创建了很多重复(属性)。有没有更好的方法?在这种情况下使用类会被认为是一个好习惯吗?
编辑:如果不使用类会更好,我正在寻找一个答案,该答案可以为我提供关于structs和的具体解决方案protocols。
我正在尝试更改数组中的元组,但是,当我尝试
emo = (type:emo.type,strength:increaseStrength(emo.strength))
它时会给我错误
"cannot assign to 'let' value 'emo'
这是我的代码:
var emotions : [(type : String, strength: Int)] = [("happy",0),("scared",0),("tender",0),("excited",0),("sad",0)]
func increaseStrength(i:Int)->Int {
switch i {
case 0: return 1
case 1: return 2
case 2: return 3
case 3: return 0
default :return 0
}
}
@IBAction func HappyBA(sender: AnyObject) {
for emo in emotions {
if (emo.type == "happy" ){
emo = (type:emo.type,strength:increaseStrength(emo.strength))
}
}
println(emotions)
}
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法来完成任务请告诉我,我很感激!谢谢..
我正在做这样的事情:
someFunction(&myClass)
Run Code Online (Sandbox Code Playgroud)
someFunction在myClass上对数组进行排序.
someFunction(inout someclass:ClassA) {
someClass.sort({$0.price > $1.price})
}
Run Code Online (Sandbox Code Playgroud)
如果我在函数调用后打印myClass,我注意到数组仍未排序.据我所知,Swift通过复制传递值.但是当我使用inout时,它不应该改为通过引用传递吗?
即使mutating func在方法中使用关键字,我也无法修改模型类变量?
所以基本上我都包裹着我的问题,在一个非常简单的方法,我有一个类Car,拥有3个变量id,start和modelNo
之后,初始化一个空的Car模型数组,然后显示10个汽车,为迭代创建一个范围范围1...10,初始化Car模型类,并将其附加到原始的cars数组中。
前5个汽车ID为0,最后5个汽车ID为1的支票
我想要一个将在其中启动相同ID的最后一辆车的过滤器,因此我创建了一个过滤并修改start变量但无法修改的方法。您能帮我做错什么吗?
请查看我的完整代码,然后将其复制粘贴到操场上。
struct Car {
var id = 0
var start = false
var modelNo: String
init(start: Bool, id: Int, model: String) {
self.start = start
self.id = id
self.modelNo = model
}
mutating func startCar(status: Bool) {
start = status
}
}
var arrCars:[Car] = [Car]()
for i in 1...10 {
let md = Car(start: false, id: i <= 5 ? 0 : …Run Code Online (Sandbox Code Playgroud)