2014-11-05 28 views
3

我只是試圖讓我的頭迅速圍繞關閉。關閉和在非法保護緩衝區指針()在迅速

我想要使用數組的withUnsafeBufferPointer方法。在最簡單的形式,我可以做這樣的事情成功:

var aa:[UInt8] = [1,2,3,4,5,6,7,8] 
var bb = aa.withUnsafeBufferPointer({$0.baseAddress}) 

我也可以這樣做:

var bb = aa.withUnsafeBufferPointer({pointerVal in pointerVal.baseAddress}) 

但是,我不能沒有在Xcode中產生的錯誤做:

var bb = aa.withUnsafeBufferPointer({pointerVal in return pointerVal.baseAddress}) 

"Cannot convert the expression's type '((ST5)->(ST5)->ST4)->((ST5)->ST4)->ST4' to type 'R' 

在前兩個分配中暗示return聲明。如果我明確表示,事情就會失敗。我無法將此與Apple的文檔調和。 (請參閱Swift編程語言中的閉包章節)。我想把一個更復雜的閉包放到這裏,這需要一個return語句。爲了實現這個目標我需要做些什麼?

回答

3

除非關閉只包含一個表達式,則需要將指定參數和返回類型

var bb = aa.withUnsafeBufferPointer({pointerVal -> UnsafePointer<UInt8> in return pointerVal.baseAddress}) 

或註釋的變量,這樣編譯器可以推斷類型:

var bb : UnsafePointer<UInt8> = aa.withUnsafeBufferPointer({pointerVal in return pointerVal.baseAddress}) 

但是你應該只在封閉內使用指向數組緩衝區的指針。 將指針存儲在像這樣的變量中是不安全的,因爲數組可能會解除分配 ,編譯器不知道這是通過bb引用的。

+0

我明白了。我同意只使用封閉內的地址,這絕對是我的意圖。 – dustincarr 2014-11-05 15:21:54