2017-02-03 3 views
-1

i'am используя функциюКак передать параметр AnyObject ... функционировать, какой параметр нужно AnyObject

NSAttributedString(attributes: [String : AnyObject]?, format: String, arguments: AnyObject...) 

И я хочу, чтобы настроить в общую функцию для вызова этой функции выше. Поэтому мне нужно отправить параметр

arguments: AnyObject...

Но этот параметр станет [AnyObject] в моей настройке. Как это исправить?

Update:

Когда я использую код ниже:

typealias Function = ([String : AnyObject]?, String, [AnyObject]) -> NSAttributedString 
let myAttributedString = unsafeBitCast(NSAttributedString(attributes:format:_:) , Function.self) 

Это даст ошибку:

Use of unresolved identifier 'NSAttributedString(attributes:format:_:)'

Update: (Temp Solution)

I получить mp решение, которое является уродливым, но работает достаточно для меня.

// NOTE: here arguments may be String or NSAttributedString 
private func getAttributedString(withFormat format: String, _ arguments: AnyObject..., withUnderLine: Bool = false) -> NSAttributedString { 
    var attributes = [NSFontAttributeName: #someFont, 
        NSForegroundColorAttributeName: #someColor] 
    if withUnderLine { 
      attributes[NSStrikethroughStyleAttributeName] = NSUnderlineStyle.StyleSingle.rawValue 
    } 

    switch arguments.count { 
     case 0: 
      return NSAttributedString(attributes: attributes, format: format) 
     case 1: 
      return NSAttributedString(attributes: attributes, format: format, arguments[0]) 
     case 2: 
      return NSAttributedString(attributes: attributes, format: format, arguments[0], arguments[1]) 
     case 3: 
      return NSAttributedString(attributes: attributes, format: format, arguments[0], arguments[1], arguments[2]) 
     case 4: 
      return NSAttributedString(attributes: attributes, format: format, arguments[0], arguments[1], arguments[2], arguments[3]) 
     default: 
      assert(arguments.count <= 4) 
      return NSAttributedString(attributes: attributes, format: format, arguments[0], arguments[1], arguments[2], arguments[3]) 
     } 
    } 
+0

Возможный дубликат [Передача массива функции с переменным числом аргументов в Swift] (http: // stac koverflow.com/questions/24024376/passing-an-array-to-a-function-with-variable-number-of-args-in-swift) – Andreas

+0

Я знаю, как это сделать с Int, но не знаю, как сделать это с AnyObject – JerryZhou

+0

О, статус https://bugs.swift.org/browse/SR-128 не обновлен? Как вы это делаете с Int? – Andreas

ответ

1

Если вы ссылаетесь инициализатор, вы должны использовать NSAttributedString.init(attributes:format:_:)

Полный вызов становится unsafeBitCast(NSAttributedString.init(attributes:format:_:), to: Function.self)

Я просто пытался что-то подобное в Swift на игровые площадки IPad:

Playgrounds screenshot

+0

Ага, Отлично! – JerryZhou

+0

Где вы это нашли? Я ничего не нашел в документе, может быть, я искал без правильных ключей. Благодарю. – JerryZhou

+0

Я смутно помню, что есть некоторые примеры, такие как '[1, 2, 3] .map (String.init)', который показывает, что инициализатор может ссылаться таким образом. –