无法访问.size withAttributes:from String

时间:2018-04-21 14:42:10

标签: ios swift string size swift-extensions

我有一个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'发生了什么?

2 个答案:

答案 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不同,并且扩展程序不允许您转换其类型。我假设您选择了一个扩展程序,使其可以全局访问,但还有其他选项。你可以让函数本身是全局的(我不会觉得有吸引力),你可以在常规staticclass中创建函数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样式的方法(我认为扩展应该主要用于)。