2016-01-28 6 views
0

Я ищу для реализации некоторых простых шаблонов строк в Swift, и мне интересно, какие встроенные параметры для замены макросов в строке со значениями во время выполнения.Быстрая интерполяция строк во время выполнения

Было бы замечательно, если бы у меня был способ использовать синтаксис интерполяции строк "\(variable)" во время выполнения, но я предполагаю, что они фактически разбираются во время компиляции, поскольку макросы могут содержать фактический код.

Я также нашел String конструктор, который принимает строку формата в стиле Objective-C, используя% @ и т.д.

let myString = String(format: "Hello %@", name) 

Это может работать, хотя мне нравится синтаксис меньше. Мне просто интересно, есть ли лучшие подходы, которые я должен предпринять, или было бы лучше просто написать мою собственную.

Возможность выполнения команд (например, операторов или вызовов метода/свойств) внутри макроса была бы удивительной, но не обязательной (и учитывая, насколько статический язык Swift не ожидается).

+2

Я не уверен, что следую тому, что вы хотите сделать (не могли бы вы привести пример использования в псевдо-экономном коде?). Возможно, вы можете использовать интроспекцию времени выполнения ('Mirror (reflecting: ...)') и подклассифицировать 'NSObject' для доступа к' self.valueForKey () ... 'и' self.setValue (, forKey: )) ', чтобы создать некоторую (небезопасную) вещь. Но, возможно, я не понимаю, чего вы хотите достичь. – dfri

+0

Да, это, вероятно, то, что я в конечном итоге сделаю, если я откажу свой синтаксис замены строки. Мне просто интересно, была ли какая-то достойная поддержка для этого встроенного. Примером может быть что-то вроде «Hello there, \ (firstName)!» И возможность разрешить это во время выполнения (очевидно, с некоторым контекстом набора), а не время компиляции. – devios1

ответ

1
import Foundation 

let serverName = "Fantastic" 
var resultString = "We are using $SERVERNAME$" 

if let range = resultString.rangeOfString("$SERVERNAME$") { 
    resultString.replaceRange(range, with: serverName) 
} 

Можно, конечно, реализовать String расширение, если вы собираетесь использовать это регулярно.

extension String { 
    func replaceString(sourceString:String, withNewElements newElements:String) throws { 
    //implementation left for the reader 
     let userInfo = ["missingString": sourceString, 
      "message": "Substring '\(sourceString)' not found in '\(self)'"] 
     throw NSError(domain: "ReplaceStringFailure", code: 1, userInfo: userInfo) 
    } 
} 
Смежные вопросы