将 4 个数字组成的字符串解析为 CGRect

Chr*_*cou 2 string ios swift

我有这个字符串(325, 140, 739, 979)。我想解析它并分别取出四个数字。

该字符串代表一个CGRect. 我想将第一个数字作为x 第二个数字作为y第三个数字width作为最后一个数字height

实现这一目标的最佳方法是什么?

Air*_*ity 5

给定您的字符串,您可以将数字作为可选数组来获取,Int如下所示:

\n\n
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。现在您有了一个选项数组,您可以检查其中的内容是否正确:

\n\n
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整数之一或数组中的错误计数,因此这应该可以防止任何垃圾输入。

\n\n

为了方便起见,您可以将所有这些放入可失败的初始化程序中CGRect

\n\n
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