我有这个字符串(325, 140, 739, 979)
。我想解析它并分别取出四个数字。
该字符串代表一个CGRect
. 我想将第一个数字作为x
第二个数字作为y
第三个数字width
作为最后一个数字height
。
实现这一目标的最佳方法是什么?
给定您的字符串,您可以将数字作为可选数组来获取,Int
如下所示:
let str = "(325, 140, 739, 979)"\nlet nums = split(str) { contains("(), ", $0) }.map { $0.toInt() }\n
Run Code Online (Sandbox Code Playgroud)\n\n这split
将删除传递给 的字符串中的任何字符contains
。现在您有了一个选项数组,您可以检查其中的内容是否正确:
let rect: CGRect\nif nums.count == 4,\n let x = nums[0], y = nums[1],\n w = nums[2], h = nums[3]\n{\n rect = CGRect(x: x, y: y, width: w, height: h)\n}\nelse {\n // report an error, or default the values if you prefer\n fatalError("Malformed input string")\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n输入字符串中的任何无关字符都将导致nil
整数之一或数组中的错误计数,因此这应该可以防止任何垃圾输入。
为了方便起见,您可以将所有这些放入可失败的初始化程序中CGRect
:
extension CGRect {\n init?(string: String) {\n // note, since CGRect also has a contains method, need to specify Swift.contains\n let nums = split(string) { Swift.contains("(), ", $0) }.map { $0.toInt() }\n\n if nums.count == 4,\n let x = nums[0], y = nums[1],\n w = nums[2], h = nums[3]\n {\n self = CGRect(x: x, y: y, width: w, height: h)\n }\n else {\n return nil\n }\n }\n}\n\nlet rectangles = [\n "(325, -140, 739, 979)", // valid\n "(1,2,3,asdadaf)", // invalid (non-integer)\n "1,2,3,4,", // valid\n "(1,2,3,4,5)", // invalid (wrong count)\n]\n\n\n// returns an array of 2 valid CGRect and 2 nil\nlet cgrects = rectangles.map { CGRect(string: $0) }\n
Run Code Online (Sandbox Code Playgroud)\n\n显然,如果您希望对您愿意转换的输入类型有更多或更少的宽容,那么您可以在此处进行很多调整。
\n 归档时间: |
|
查看次数: |
1167 次 |
最近记录: |