GVKun编程网logo

在Swift 2.2中替换C风格的循环(swift替换字符串)

16

对于在Swift2.2中替换C风格的循环感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解swift替换字符串,并且为您提供关于.toInt()在Swift2中删除?、15.8Swift闭包属

对于在Swift 2.2中替换C风格的循环感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解swift替换字符串,并且为您提供关于.toInt()在Swift 2中删除?、15.8 Swift闭包属性引起的循环强引用问题、15.9 Swift解决闭包引起的循环强引用问题、ios – Swift Eureka Form中的循环的宝贵知识。

本文目录一览:

在Swift 2.2中替换C风格的循环(swift替换字符串)

在Swift 2.2中替换C风格的循环(swift替换字符串)

Swift 2.2不推荐使用C风格的循环。但是在某些情况下,新的范围运算符可能无法正常工作。

for var i = 0; i < -1; ++i { ... }

for i in 0..<-1 { ... }

后者将在运行时失败。我可以if用来包装循环,但有点混乱。有时,这种循环很有用。

有什么想法吗?

用例

  1. 您需要枚举数组中除最后一个元素之外的所有元素。
  2. 您需要枚举十进制范围内的所有整数,但范围可以是[0.5,0.9],因此没有整数(经过一些数学运算),这将导致空循环。

答案1

小编典典

尽管它不是“漂亮”的,但您可以使用stride

for var i in 0.stride(to: -1, by: -1) {    print(i)}

.toInt()在Swift 2中删除?

.toInt()在Swift 2中删除?

我正在使用一个应用程序,使用一个文本字段,并将其翻译成一个整数。以前的我的代码
textField.text.toInt()

工作。现在Swift声明这是一个错误,并告诉我做

textField.text!.toInt()

并且它说没有toInt()和尝试使用Int()。这也不工作。刚刚发生了什么?

在Swift 2.x中,.toInt()函数从String中删除。作为替代,Int现在有一个初始化器接受一个字符串
Int(myString)

在你的情况下,你可以使用int(textField.text!)insted的textField.text!.toInt()

Swift 1.x

let myString: String = "256"
let myInt: Int? = myString.toInt()

Swift 2.x,3.x

let myString: String = "256"
let myInt: Int? = Int(myString)

15.8 Swift闭包属性引起的循环强引用问题

15.8 Swift闭包属性引起的循环强引用问题

/**

15.8-闭包属性引起的循环强引用问题

所谓的循环强引用,是指两个对象相互强引用指向对方。谁都不撒手,造成这两个对象都不会被系统所释放,造成内存泄漏。

那么怎么解决它呢?将其中一个对象变成弱引用指向对方,或者说持有对方。

weak uNowned 关键字来解决。

*/


var cr: CycleRef? = CycleRef.init() // 引用计数为1

// 我们知道延迟存储属性,第一次访问的时候才初始化。

cr!.closure() // 引用计数为 +1

cr = nil // 引用计数为-1

/**

我们可以看到如果不执行 cr!.closure() 的话,会打印出 deinit!

那么执行了 cr!.closure(),产生了循环引用,没有打印出 deinit!

两个对象:闭包对象,cr指向的对象。

前提:闭包或者函数是引用数据类型。

*/



class CycleRef {

var a: Int = 9

lazy var closure: ()->Void = {


/**

默认闭包会对它访问的对象执行强引用。

这个地方访问了self ,导致调用 该闭包的时候引用计数+1

如果闭包属性中没有直接或者间接访问self,就不会产生循环强引用。

*/

print("a=\(self.a)")

print("Closure!")

}

deinit {

print("deinit!")

}

}

15.9 Swift解决闭包引起的循环强引用问题

15.9 Swift解决闭包引起的循环强引用问题

/**

15.9-解决闭包引起的循环强引用问题

*/

var cr: CycleRef? = CycleRef.init() // 引用计数为1

// 我们知道延迟存储属性,第一次访问的时候才初始化。

cr!.closure() // 引用计数为 +1

cr = nil // 引用计数为-1

/**

我们可以看到如果不执行 cr!.closure() 的话,会打印出 deinit!

那么执行了 cr!.closure(),产生了循环引用,没有打印出 deinit!

两个对象:闭包对象,cr指向的对象。

前提:闭包或者函数是引用数据类型。

*/





class CycleRef {

var a: Int = 9

/**

weak uNowned不能修饰闭包,

那么如何解决闭包强引用呢?

系统有默认解决方法,

捕获列表

// 一般使用这个,uNowned修饰非可选类型,所以下面访问self不需要解包

[uNowned self] in

// weak 修饰可选类型, 所以下面访问self! 要解包

[weak self] in

*/

lazy var closure: ()->Void = {

/**

默认闭包会对它访问的对象执行强引用。

这个地方访问了self ,导致调用 该闭包的时候引用计数+1

如果闭包属性中没有直接或者间接访问self,就不会产生循环强引用。

*/

[uNowned self] in

print("a=\(self.a)")


// [weak self] in

// print("a=\(self!.a)")

print("Closure!")

}

deinit {

print("deinit!")

}

}

ios – Swift Eureka Form中的循环

ios – Swift Eureka Form中的循环

我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.

我试图使用的代码是:

let itemNames = ["one","two","three"]

// Eureka From Set-up
form
    +++ Section("Select item values")

    for itemName in itemNames{
        <<< StepperRow() {
            $0.tag = itemName
            $0.title = itemName
            $0.value = 0
        }
    }

但是,当我这样做时,我在StepperRow行上出现了一个错误:

Unary operator cannot be separated from its operand

所以看起来Swift不再认为它在形式之内并且正在关注<符号小于,而不是行声明. 有关如何解决这个问题的任何想法?

解决方法

<<<<<是一个二元运算符,它需要两个操作数(lhs<<<< rhs),而在上面的例子中,你只提供一个(<<<<操作数). 不可能“管道”for循环的每个遍数,例如,如果每个遍是一个rhs,要与循环范围之外的lhs操作数一起使用(第一遍的lhs是形式Section的结果(.. )).但是,您可以使用reduce来实现此类功能.现在,我没有使用Eureka表单测试它(但是在虚拟结构和运算符上),但它应该类似于以下内容:(基于和<<<<<<<运算符函数在 Eureka/Source/Core/Operators.swift中声明)
form 
    +++ itemNames.reduce(Section("Select item values")) { (section,itemName) in
        section 
            <<< StepperRow() {
                $0.tag = itemName
                $0.title = itemName
                $0.value = 0
            }
    }

我们今天的关于在Swift 2.2中替换C风格的循环swift替换字符串的分享就到这里,谢谢您的阅读,如果想了解更多关于.toInt()在Swift 2中删除?、15.8 Swift闭包属性引起的循环强引用问题、15.9 Swift解决闭包引起的循环强引用问题、ios – Swift Eureka Form中的循环的相关信息,可以在本站进行搜索。

本文标签: