调用String.size(withAttributes:)报错:类型'(String)->String'无size成员
问题分析与解决办法
你的问题出在方法调用方式和方法定义不匹配上,我来帮你拆解清楚:
错误根源
你定义的iconName(identifier:)是String的实例方法——也就是说,它需要通过一个具体的String实例来调用(比如"someString".iconName(...))。但你用String.iconName("myiconname")这种类方法的形式调用时,得到的并不是你期望的String结果,而是一个函数类型(String) -> String(相当于把这个实例方法本身当成了返回值)。这个函数类型自然没有size(withAttributes:)方法,所以才会报错。
两种解决思路
思路1:把扩展改成类方法(静态方法)
如果你的library()方法本身可以通过String类直接调用(比如它也是静态方法),那把iconName改成静态方法即可:
extension String { static func iconName(identifier: String) -> String { // 这里如果library()是实例方法的话,需要先调整它的实现 // 另外建议加个默认值,避免字典取值返回nil导致崩溃 return Self.library()[identifier] ?? "" } }
这样调用String.iconName("myiconname")就会返回一个String实例,后续调用size(withAttributes:)就完全正常了。
思路2:用String实例调用原方法
如果library()必须依赖String实例才能工作,那你需要先创建一个String实例,再调用iconName:
// 比如用空字符串作为基础实例,或者你业务中需要的特定实例 let baseString = "" let icon = baseString.iconName(identifier: "myiconname") var iconSize = icon.size(withAttributes: someAttributes)
补充说明
你提到直接调用String的size方法没问题,那是因为你当时调用的是具体String实例的方法(比如"hello".size(withAttributes: ...)),这和你错误调用得到的函数类型完全不是一回事,所以不会报错。
内容的提问来源于stack exchange,提问作者tentmaking
相关产品推荐
相关产品推荐

