小编Pat*_*tru的帖子

使用反射在Swift中更改属性

我正在尝试创建一个将更改对象属性的序列化程序.

例:

class testobj{
    var prop1:Int = 3
    var prop2:String = "Hello"
    var prop3:Dictionary<String,String> = Dictionary<String,String>()
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用访问属性的名称和类型

reflect(testobjc())[0].1
Run Code Online (Sandbox Code Playgroud)

var tester = testobj()
_std_lib_DemangledTypeName(tester.prop1)
Run Code Online (Sandbox Code Playgroud)

但我想做的事情是这样的

var tester = testobj()
for(var x:Int = 0; x < reflect(testobj()).count; x++){
    if(_std_lib_DemangledTypeName(tester.(reflect(testobj())[0].1)) == "Swift.String"){
        tester.(reflect(testobj())[0].1) = "World!"
    }
}
Run Code Online (Sandbox Code Playgroud)

本质上,我想遍历为给定类列出的所有属性,并在该类的新创建的对象上设置属性.任何指导将不胜感激.快速反射对我来说是新的.

reflection swift

6
推荐指数
1
解决办法
1497
查看次数

计算Swift字符串中的行数

从Web服务中读取一个中等大小的文件(大约500kByte)后,我有一个lines最初编码的常规Swift String().isolatin1.在实际拆分之前,我想计算行数(快速),以便能够初始化进度条.

实现这一目标的最好的Swift成语是什么?

我想出了以下内容:

let linesCount = lines.reduce(into: 0) { (count, letter) in
   if letter == "\r\n" {
      count += 1
   }
}
Run Code Online (Sandbox Code Playgroud)

这看起来并不太糟糕,但我问自己是否有更短/更快的方法.该characters属性提供对一系列Unicode字素的访问,这些字形\r\n仅作为一个实体处理.用all检查这个CharacterSet.newlines不起作用,因为CharacterSet它不是一组CharacterUnicode.Scalar在我的书中有一组(在我的书中有点反直觉),它是一组代码点(其中\ r \n计为两个代码点),而不是字形.试

var lines = "Hello, playground\r\nhere too\r\nGalahad\r\n"
lines.unicodeScalars.reduce(into: 0) { (cnt, letter) in
if CharacterSet.newlines.contains(letter) {
    cnt += 1
}
Run Code Online (Sandbox Code Playgroud)

}

将计数为6而不是3.因此这比上述方法更通用,但它不能正确用于CRLF行结尾.

有没有办法允许更多的行结束约定(如CharacterSet.newlines)仍然可以实现CRLF的正确结果?可以使用更少的代码计算行数(同时仍然保持可读性)?

unicode line-endings swift

2
推荐指数
2
解决办法
3347
查看次数

标签 统计

swift ×2

line-endings ×1

reflection ×1

unicode ×1