Не удается получить доступ к.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Вы можете сделать structstaticВы можете сделать шаблон синглтона, вы можете сохранить функцию в делегате приложения и вызвать ее там - у вас есть список опций, чтобы сделать свойства и методы "глобальными".

Потому что все, что делает этот метод, это взять 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 это используется во всем приложении (что, я думаю, что расширения должны в первую очередь использоваться).

Другие вопросы по тегам