我有一个swift的问题,我不知道如何解决它,因为我只有2个月的学习swift,我正在逐步学习,我相信是 NSRegularExpression 所以这里是代码:
import Foundation
var dir = "/home/guillermo/Escritorio/";
var archivo = "tokens";
var ruta = dir.stringByAppendingPathComponent(archivo);
guard var archivoTokens = try? String(contentsOfFile: ruta, encoding: NSUTF8StringEncoding) else {
// la condicion guard requiere una salida cuando la condicion no se satisface
//Tambien puedes usar `return` si esta dentro de la funcion
fatalError("fallo al leer archivoTokens desde el archivo")
}
// ahora archivoTokens es un NSString normal no-nulo
var lineasArchivoTokens:[String] = archivoTokens.componentsSeparatedByString("\n");
var TOKENS:[String] = [String]();
var PATRONES:[String] = [String]();
var NOMBRES:[String] = [String]();
var LEXEMAS:[String] = [String]()
var count = lineasArchivoTokens.count-1;
for index in 0..<count{
var tmpList:[String] = (lineasArchivoTokens[index]).componentsSeparatedByString(" ");
PATRONES.append(tmpList[1]);
NOMBRES.append(tmpList[0]);
}
//print(NOMBRES)
archivo = "codigo";
ruta = dir.stringByAppendingPathComponent(archivo);
guard var archivoCodigoFuente = try? String(contentsOfFile: ruta, encoding: NSUTF8StringEncoding) else {
fatalError("falla al leer archivoCodigoFuente desde el archivo")
}
var lineasArchivoCodigoFuente:[String] = archivoCodigoFuente.componentsSeparatedByString("\n");
count = lineasArchivoCodigoFuente.count-1;
for index in 0..<count{
if lineasArchivoCodigoFuente[index] != "" {
let tmpList:[String] = (lineasArchivoCodigoFuente[index]).componentsSeparatedByString("");
for word in tmpList {
if word != "" {
LEXEMAS.append(word);
}
}
}
}
for item in lineasArchivoTokens{
print("Patrones| " + " Nombres|")
print(item)
}
var countL = LEXEMAS.count-1;
var countP = PATRONES.count-1;
var patternIndex:Int = -1;
for indexL in 0..<countL {
var input:NSString = NSString(string: LEXEMAS[indexL]);
var range:NSRange = NSMakeRange(0, input.length)
TOKENS.append("no existe");
for indexP in 0..<countP {
//error: ambiguous reference to member 'subscript'
var regex = NSRegularExpression(pattern: PATRONES[indexP], options: nil, error: nil);
var matches = regex!.matchesInString(LEXEMAS[indexL], options: nil, range: range)
if matches.count > 0 {
TOKENS[indexL] = NOMBRES[indexP];
print(NOMBRES[indexP] + " " + (input as String) + "\n");
break;
}
}
}
这是错误:
:72:50: error: ambiguous reference to member 'subscript'
var regex = NSRegularExpression(pattern: PATRONES[indexP], options: nil, error: nil);
^~~~~~~~
Swift.Array:96:12: note: found this candidate
public subscript (index: Int) -> Element { get set }
^
Swift.Array:100:12: note: found this candidate
public subscript (subRange: Range<Int>) -> ArraySlice<Element> { get set }
^
Swift.MutableCollectionType:3:12: note: found this candidate
public subscript (bounds: Range<Self.Index>) -> MutableSlice<Self> { get set }
^
Swift.CollectionType:2:12: note: found this candidate
public subscript (bounds: Range<Self.Index>) -> Slice<Self> { get }
^
/home/guillermo/lexico7/Sources/main.swift:77:46: error: cannot convert value of type 'NSString' to type 'String' in coercion
print(NOMBRES[indexP] + " " + (input as String) + "\n");
答案 0 :(得分:2)
这只是一个不幸的错误消息。以下是您需要更改的行:
var regex = try? NSRegularExpression(pattern: PATRONES[indexP], options: NSRegularExpressionOptions(rawValue: 0))
var matches = regex!.matchesInString(LEXEMAS[indexL], options: NSMatchingOptions(rawValue: 0), range: range)
在Swift中,您不能只为nil
传递这些选项参数,因为它们不是可选的。顺便说一句,在Swift中每个语句的末尾都不需要分号。