我有一个String
分机:
func iconName(identifier: String) -> String
{
return self.library()[identifier]
}
我在UIImage
扩展程序中执行此操作:
let icon = String.iconName("myiconname")
var iconSize = icon.size(withAttributes: someAttributes)
我收到错误:
Value of type '(String) -> String' has no member 'size'
我试图以不同的方式切换它,每次都会得到相同(或类似)的错误。
事情是它确实有一个成员大小。我可以做到这一点,没有错误:
var myString = "testing"
myString.size(withAttributes: attributes)
任何人都知道Value of type '(String) -> String'
发生了什么?
答案 0 :(得分:0)
方法
size(withAttributes:)
是NSString
中的实例方法,而不是String
请参阅Docs
因此,您可以将方法的签名更改为
func iconName(identifier: String) -> NSString {....}
//
你不应该使用
let icon = String.iconName("myiconname") // here String is a generic type
因为扩展名被指定用于像
这样的对象let icon = "someStringValue".iconName("myiconname")
答案 1 :(得分:0)
我不会在此处使用String
扩展名,因为返回的类型为(String) -> String
,与类型String
不同,并且扩展程序不允许您转换其类型。我假设您选择了一个扩展程序,使其可以全局访问,但还有其他选项。你可以让函数本身是全局的(我不会觉得有吸引力),你可以在常规static
或class
中创建函数struct
,你可以使{struct
1}} static
,你可以做单例模式,你可以将函数存储在app委托中并在那里调用它 - 你有一个选项列表来制作属性和方法" global"
因为这个方法的所有功能都是String
并将其转换为修改后的String
,不需要单例,所以我很可能会创建一个具有静态属性的全局类。
class Globals {
static func iconName(_ identifier: String) -> String {
return "slickDaddy"
}
}
let icon = Globals.iconName("myIconName")
var iconSize = icon.size(withAttributes: [NSAttributedStringKey.backgroundColor: UIColor.blue])
print(iconSize) // prints (58.01953125, 13.8)
您可以在应用中的任何位置调用此方法。当然要考虑我上面提到的所有其他迭代,并使用最适合你的那个。此外,即使您可以在扩展中执行此操作,我个人也不会。这是一种在非常特殊的情况下使用的业务方法,而不是修改在整个应用程序中使用的String
样式的方法(我认为扩展应该主要用于)。