Swift 4中如何获取CATextLayer的string属性值?
问题原因&解决方案
你遇到的问题很典型——因为cameraView.layer.sublayers返回的数组元素类型是CALayer,而string是CATextLayer特有的属性,父类CALayer并没有这个属性,所以直接通过下标访问的时候,智能提示找不到它,编译也会报错。
解决这个问题的核心是把CALayer类型向下转换为CATextLayer,下面给你两种可行的方案:
方案1:安全转换下标对应的图层(不推荐硬编码下标)
如果你确定第3个图层(下标2)就是你创建的CATextLayer,可以用可选转换来获取它:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let touch = touches.first guard let point = touch?.location(in: cameraView) else { return } // 先尝试转换为CATextLayer,再访问string属性 if let textLayer = cameraView.layer.sublayers?[2] as? CATextLayer { // 建议用可选绑定处理string,避免强制解包崩溃 if let text = textLayer.string { print(text) self.selectedObject = text } } }
方案2:通过name属性查找(更安全推荐)
硬编码下标非常危险——如果后续子图层的顺序发生变化,代码就会出错。你已经给CATextLayer设置了name="someText",可以通过遍历子图层找到它:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let touch = touches.first guard let point = touch?.location(in: cameraView) else { return } // 遍历子图层,找到name匹配的CATextLayer if let targetLayer = cameraView.layer.sublayers?.first(where: { $0.name == "someText" && $0 is CATextLayer }) as? CATextLayer { if let text = targetLayer.string { print(text) self.selectedObject = text } } }
额外提醒
- 尽量避免使用
!强制解包,比如cameraView.layer.sublayers![2],如果数组为空或者下标越界,会直接崩溃,用?可选链+可选绑定更安全。 CATextLayer的string属性类型是Any?,它可以是String也可以是NSAttributedString,如果你确定是普通字符串,也可以加上类型转换:textLayer.string as? String。
内容的提问来源于stack exchange,提问作者Muhammad Taha
相关产品推荐
相关产品推荐

