You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:23