草庐IT

Swift:总是在 inout 上复制?

我编写了一个用于序列化模型数据的简单库,后来意识到我在只读取数据时正在写入数据。我能够将问题减少到以下Playground片段:classFoo{init(){name="test"}varname:String{didSet{print("settingname:\(self.name)")}}}funcmap(inoutfoo:String){print("writingvalue:\(foo)")}varfoo:Foo=Foo()map(&foo.name)结果(对我来说)出乎意料:writingvalue:testsettingname:test我重新阅读了关于inout参数的

ios - Swift 中的 "mutating"函数和 "inout"参数有什么区别吗?

根据Swift文档,mutating和inout关键字都用于修改函数内的值类型。“mutating”和“inout”之间有什么区别,以及我们需要使用它们中的任何一个的任何特殊情况。 最佳答案 mutating标记一个方法。inout标记一个参数。它们是完全不同的东西。标有mutating的方法可以改变self即设置self的属性,重新分配self等。structFoo{varfoo:Intmutatingfuncmutate(){foo+=1//thisismutatingself}}标有inout的参数基本上成为var变量,而不是

ios - Swift:在转义被调用函数的闭包中捕获inout参数

我试图编写一个“编辑器”类,它可以保留对不同对象上的属性的引用以供以后修改。我首先编写编辑器类以接收一个用于读取的闭包和一个用于写入的闭包。这奏效了。然后我尝试通过(inout)引用传递有问题的参数,然后从中生成getter/setter对。这没有用。Swift文档确实说(释义)Swift计算出何时复制,何时不复制。我认为我反对这种限制的不可预测性,但我认为我会提出同样的问题。或者,是否可以为单独的getter和setter获取柯里化(Currying)函数?我的代码是:classSomeModel:Printable{vara:Stringinit(a:String){self.a=

ios - swift 错误 : '&' used with non-inout argument of type 'UnsafeMutablePointer'

我正在尝试从中转换以下Objective-C代码(source)-(CGRect)dimensionsForAttributedString:(NSAttributedString*)asp{CGFloatascent=0,descent=0,width=0;CTLineRefline=CTLineCreateWithAttributedString((CFAttributedStringRef)asp);width=CTLineGetTypographicBounds(line,&ascent,&descent,NULL);//...}进入swift:funcdimensionsFo

cocoa - Swift 和 inout 参数中的闭包捕获变量

我注意到当一个变量被Swift中的闭包捕获时,闭包实际上可以修改值。这对我来说似乎很疯狂,而且是获得可怕错误的绝佳方法,特别是当同一个var被多个闭包捕获时。varcapture="Hellocaptured"funcg(){//thisshouldn'tbepossible!capture=capture+"!"}g()capture另一方面,还有inout参数,它允许函数或闭包修改其参数。inout有什么用,连捕获的变量都已经可以不受惩罚地修改了??!!只是想了解这背后的设计决策...... 最佳答案 从外部范围捕获的变量不是例

arrays - 不确定这种 inout 场景是如何安全的,因为数组在返回时会失效

下面的代码没有崩溃,但鉴于可用的“有限”文档,我无法解释原因。funcfoo(inouta:[Int],inoutb:Int){a=[]b=99}vararr=[1,2,3]//confusion:wheredoesthe"out"ofbgoto?//storageforawasalreadycleared/invalidatedfoo(&arr,b:&arr[2])print(arr)//arrisempty 最佳答案 我相信这就是正在发生的事情。当你分配a=[]您正在将a指向一个新数组。原始数组仍然存在于内存中,当您这样做时:b

Swift 4 编程语言,inout 参数不适用于函数类型作为参数

这是swift文档中的示例代码。我正在学习swift语言,我看到函数类型作为参数,示例代码没有inout关键字。但是我试图将它与inout参数一起使用,但下面的示例没有按预期工作。https://docs.swift.org/swift-book/LanguageGuide/Functions.html(函数类型作为返回类型)//FunctionTypesasReturnTypesfuncstepForward(_input:inoutInt)->Int{returninput+1}funcstepBackward(_input:inoutInt)->Int{returninput-1

swift - 作为 inout 参数的不可变值

我想要一个指针作为类的参数。但是当我尝试对init进行编码时,我遇到了这个错误:Cannotpassimmutablevalueoftype'AnyObject?'作为输入参数classMyClass{varvaluePointer:UnsafeMutablePointerinit(value:inoutAnyObject?){self.valuePointer=&value}}我想创建一些MyClass的实例,它们都可以引用相同的“值”。然后,当我在这个类中编辑这个值时,它会在其他地方发生变化。这是我第一次在Swift中使用指针。我想我做错了......

Swift 闭包捕获和 inout 变量

考虑以下代码:funcfoo(inoutsuccess:Bool)->(()->()){return{_insuccess=trueprint(success)}}varsuccess=falseletclosure=foo(&success)closure()//prints"true"print(success)//prints"false"闭包似乎是创建成功的副本,并没有改变原来的。为什么会这样?我曾假设闭包会指向原始闭包,因为我们正在传递一个inout变量。 最佳答案 这不会更新您的success变量是有道理的,因为您的in

objective-c - 如何在 Objective-C 中使用带有 inout 参数的 Swift 中的方法?

我要funcfoo(inoutstop:Bool)->Void{//...}在我的Objective-C部分使用。但它永远不会在Module-Swift.hheader中生成。如果我用@objc标记它,Methodcannotbemarked@objcbecausethetypeoftheparametercannotberepresentedinObjective-C发生错误。 最佳答案 您不能使用inout与Objective-C桥接时的参数,但如果使用UnsafeMutablePointer也可以做类似的事情(T在您的情况下将