Не удается получить доступ к.size с помощью атрибутов: из строки
У меня есть 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 ответа
Метод
size(withAttributes:)
это метод экземпляра внутри NSString
не String
смотрите здесь в Документах
Таким образом, вы можете изменить подпись метода на
func iconName(identifier: String) -> NSString {....}
//
Вы не должны использовать
let icon = String.iconName("myiconname") // here String is a generic type
как расширение предназначено для использования с таким объектом, как
let icon = "someStringValue".iconName("myiconname")
Я бы не использовал String
расширение здесь, потому что возвращение имеет тип (String) -> String
который не совпадает с типом String
и расширение не позволит вам разыграть его тип. Я предполагаю, что вы выбрали расширение, чтобы сделать его глобально доступным, но есть и другие варианты. Вы можете сделать функцию самой глобальной (что я не нахожу привлекательной), вы можете сделать функцию static
в обычном class
или же struct
Вы можете сделать struct
static
Вы можете сделать шаблон синглтона, вы можете сохранить функцию в делегате приложения и вызвать ее там - у вас есть список опций, чтобы сделать свойства и методы "глобальными".
Потому что все, что делает этот метод, это взять 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
это используется во всем приложении (что, я думаю, что расширения должны в первую очередь использоваться).