2016-06-06 11 views
2

Ich mag die Zeilennummer bekommen, wo ich den Index für Debugging-Zwecke (wie Index außerhalb des zulässigen Bereichs und so weiter) genannt habe:Get Zeilennummer in Indizes mit #line

/* 1*/ struct Collection { 
/* 2*/  // this works flawlessly 
/* 3*/  func getElement(index: Int, line: UInt = #line) -> Double { 
/* 4*/   print(line) // 16 
/* 5*/   return 0.0 
/* 6*/  } 
/* 7*/  
/* 8*/  // error: Default argument is only permitted for a non-curried function parameter 
/* 9*/  subscript(index: Int, line: UInt = #line) -> Double { 
/*10*/   print(line) // should print 17 
/*11*/   return 0.0 
/*12*/  } 
/*13*/ } 
/*14*/ 
/*15*/ let c = Collection() 
/*16*/ c.getElement(1) 
/*17*/ c[1] 

Wie Sie das sehen tiefgestellte Version funktioniert nicht.

Gibt es einen Workaround für diese Einschränkung?

+4

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html: * "Indizes können variable Parameter und variadische Parameter verwenden, ** können ** aber nicht in-out verwenden Parameter oder ** liefern Standardparameterwerte. ** "* –

+0

@AMomchilov: Selbst wenn es inline wäre, würde der Compiler immer noch die korrekte Zeilennummer einfügen. Das ist nicht das Problem. –

+0

@VatsalManot oh, du hast Recht, dass die Vorverarbeitung vor der Kompilierung stattfindet. Hmm, welchen Grund könnte es geben, ausgefallene Werte zu verbieten? – Alexander

Antwort

1

Ich bin überrascht, dass dies nicht möglich ist! Ich habe das gerade selbst getestet (mit Swift 2.2), und ich kann bestätigen, dass dies passiert.

Es scheint keine Problemumgehung dafür zu geben. Es kann oder auch nicht ein Fehler sein. Wenn Sie denken, dass dieser Fehler unbeabsichtigt ist, empfehle ich Ihnen, einen Fehler bei https://bugs.swift.org einzureichen.


Edit: @MartinR richtig deutete nur einige documentation wie im Abschnitt Kommentare:

Indizes eine beliebige Anzahl von Eingabeparametern nehmen, und diese Eingangs Parameter beliebigen Typs sein kann. Indizes können auch einen beliebigen Typ zurückgeben. Indizes können variable Parameter und variadische Parameter verwenden, aber kann keine In-Out-Parameter verwenden oder Standardparameterwerte bereitstellen.

Diese ist absichtliches Verhalten.

+0

Ich denke, es ist wegen der gesamten Modul-Optimierung –

+0

@ale_stro: Ich bezweifle es sehr. Nur überprüft, wurde die gesamte Modul-Optimierung in meinem Debug-Build deaktiviert. –