2014-11-14 50 views
2

該第一塊來生成通用夫特編譯錯誤(甚至不指向線)swift不允許在函數參數中初始化嗎?

let screenDivision = size.width/5; 
var game1 = SKSpriteNode(color: .redColor(), size: CGSize(width: 2 * screenDivision, height: size.height)); 

該第二塊工作正常。

let screenDivision = size.width/5; 
var a = CGSize(width: 2 * screenDivision, height: size.height) 
var game1 = SKSpriteNode(color: .redColor(), size: a); 

爲什麼?我討厭再次遇到這個錯誤,不記得我寫這些代碼的地方。

(我還需要傳遞一個變量,而不是常量?跆拳道...如果我改變一個變種,讓一個,我得到的編譯錯誤])

+0

我沒有做過廣泛的研究,發現當這是固定的,但至少爲雨燕3.2的,這是沒有更長的問題 –

回答

4

錯誤消失,如果你在您的通話UIColorredColor

let screenDivision = size.width/5; 
var game1 = SKSpriteNode(
    color: UIColor.redColor(), 
    size: CGSize(width: 2 * screenDivision, 
    height: size.height) 
) 

我不知道離開了類型名稱類方法的能力。我只知道枚舉案例的可能性。 Swift編程指南mentions特別指出這可以通過枚舉實現,但在type method部分沒有提及。

我真的很驚訝,第二個版本的作品。現在,除非您指的是枚舉個案,否則我會始終包含類型名稱。

+0

僅供參考,[「枚舉案例模式」](https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097- CH36-XID_1012)和「隱式成員表達」在語法上有所不同。 – rintaro

+1

'.redColor()'應該在此上下文中編譯。 – 0x141E

+0

@rintaro,我不知道那是在語法中,謝謝你指出。當這是可能的時候,它仍然非常模糊。例如,這隻有在類方法位於正在返回的類上時纔有可能,或者它是否適用於返回所需類型的任何類方法? – drewag

4

看來,這是一個編譯器錯誤。

在這種情況下,應該執行"Implicit Member Expression"

隱式構件表達式是訪問類型的成員,例如枚舉情況或一個類方法,在一個上下文,其中類型推理可確定隱含的類型的縮寫方式。它具有以下形式:

.成員名稱

我轉載確切這段代碼同樣的問題:

class MyClass { 
    class func create() -> MyClass { return MyClass() } 
} 

func f(arg:MyClass!, arg2:Int) { } 

f(.create(), 1) 

/* 
Bitcast requires both operands to be pointer or neither 
    %.asUnsubstituted = bitcast %C4test7MyClass* %6 to i64 
LLVM ERROR: Broken function found, compilation aborted! 
*/ 

甚至與enum

enum MyEnum { 
    case Case1 
} 

func f(arg:MyEnum!, arg2:Int) { } 

f(.Case1, 1) 

/* 
0 swift     0x00000001062d8a68 llvm::sys::PrintStackTrace(__sFILE*) + 40 
1 swift     0x00000001062d8f54 SignalHandler(int) + 452 
2 libsystem_platform.dylib 0x00007fff8a314f1a _sigtramp + 26 
3 libsystem_platform.dylib 0x00007fd8085362e8 _sigtramp + 2116162536 
4 swift     0x00000001056e8e98 emitApplyArgument((anonymous namespace)::IRGenSILFunction&, swift::SILValue, swift::SILParameterInfo, llvm::ArrayRef<swift::Substitution>, swift::irgen::Explosion&) + 456 
5 swift     0x00000001056e5f1d swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 34605 
6 swift     0x00000001056dcbab swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9179 
7 swift     0x0000000105656347 swift::irgen::IRGenModule::emitLazyDefinitions() + 199 
8 swift     0x00000001056c9966 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2038 
9 swift     0x00000001056ca2e3 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51 
10 swift     0x000000010561f5f4 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 5444 
11 swift     0x000000010561c96d main + 1677 
12 libdyld.dylib   0x00007fff90b525c9 start + 1 
13 libdyld.dylib   0x0000000000000010 start + 1867176520 
Stack dump: 
0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file test.swift -target x86_64-apple-darwin14.0.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -color-diagnostics -module-name test -o /var/folders/kb/xgglxb597sv6h8b744d5vft00000gn/T/test-4cf5cc.o 
1. While emitting IR SIL function @top_level_code<unknown>:0: error: unable to execute command: Segmentation fault: 11 
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation) 
*/ 

這兩種情況下,從函數參數中刪除!可解決問題。

比方說:「DO NOT使用隱成員表達了隱含展開可選的上下文」

+0

良好的結果,和不錯的答案。請務必[文件錯誤](http://bugreport.apple.com)! – rickster

+0

謝謝,這讓我感覺更健全。 不幸的是,我不能控制SKSpriteNode初始化器來改變它的原型參數,所以我不得不使用drewag的解決方案。 這是一件非常酷的事情,但你找到了。我會提交錯誤,儘管我確定其他人已經提交了它。 –

+0

當然。我只是想知道「導致這個bug的原因」 – rintaro