在运行Swift 1.2的Xcode 6.3 beta中,我似乎成功地从API中检索了一个JSON对象,但是调试器声称该对象没有属性.API在localhost上运行,并且调用如下:
NSURLConnection.sendAsynchronousRequest( request, queue: queue,
completionHandler: completionHandler )
Run Code Online (Sandbox Code Playgroud)
completionHandler 是一个带断点的闭包:
let completionHandler =
{
( response: NSURLResponse!, data: NSData!, error: NSError! ) -> Void in
// BREAKPOINT HERE
}
Run Code Online (Sandbox Code Playgroud)
调试器显示在Xcode 6.3 beta中使用Swift 1.2 数据:NSData!是一个190字节的ObjectiveC.NSObject但没有属性,这似乎是完全矛盾的.我只是希望JSON数据,我希望隐藏在那些字节中的某个地方.我不知道调试器,或需要为Swift 1.2更新的代码,或者我对事物的理解,或其他东西都应该受到指责.我只想要JSON.
后记
JSON数据一直存在,就像字节数一样,并且得到它非常简单(使用SwiftyJSON):
let json = JSON( data: data )
Run Code Online (Sandbox Code Playgroud)
不过,Xcode 6.3 beta调试器中的属性发生了什么,仍然是一个谜.我不是把它作为我自己问题的答案,因为虽然它有效,但它可能不一定是答案.我对Swift太新了,不知道实际的答案是什么,或者即使有一个答案.
Podspec 是:
Pod::Spec.new do |s|
s.name = 'MyPod'
s.version = '0.1.0'
s.summary = 'my summary.'
s.platform = :ios, '13.0'
s.description = <<-DESC
My description.
DESC
s.homepage = 'https://github.com/MyAccount/MyPod'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Me' => 'my@email.com' }
s.source = { :git => 'https://github.com/MyAccount/MyPod.git', :tag => s.version.to_s }
s.swift_version = '5.0'
s.source_files = 'MyPod/Classes/**/*'
s.static_framework = true
s.dependency 'Firebase'
s.dependency 'Firebase/Core'
s.dependency 'Firebase/Auth'
s.dependency 'Firebase/Database'
s.dependency 'GoogleSignIn'
s.dependency 'GoogleAPIClientForREST/Core'
s.dependency 'GoogleAPIClientForREST/Sheets'
s.dependency 'GTMAppAuth' …Run Code Online (Sandbox Code Playgroud) 这编译:
let s = SignalsService()
s.addListener( "key", callback: { a, b in print( "success" ) } )
Run Code Online (Sandbox Code Playgroud)
这不是:
let s = SignalsService()
let cb = { a, b in print( "success" ) }
s.addListener( "key", callback: cb )
Run Code Online (Sandbox Code Playgroud)
引发错误Ambiguous reference to member 'print'的let cb = ...行.
那为什么呢?
快速问题:为什么?
语境:
我使用Swinject依赖注入将small-s单例模型类添加到我的视图中:
defaultContainer.registerForStoryboard( MyViewController.self )
{
responder, viewController in
viewController.proxy = responder.resolve( MyProxy.self )!
}
Run Code Online (Sandbox Code Playgroud)
我想通过使用计算属性来防止意外覆盖此单例实例的风险:
private var _proxy: MyProxy!
var proxy: MyProxy
{
set { if _proxy == nil { _proxy = newValue } }
}
Run Code Online (Sandbox Code Playgroud)
但.我不能.因为我还必须宣布一个吸气剂.
令人沮丧!
现在我使用以下hack.但真的......
var proxy: MyProxy?
{
get { return nil }
set { if _proxy == nil && newValue != nil { _proxy = newValue } }
}
Run Code Online (Sandbox Code Playgroud) 有没有比嵌套if语句更好的处理可选属性链的方法?我被建议在检查可选属性时使用if,这有意义,因为它在编译时而不是运行时处理它们,但它看起来像是疯狂!有更好的方法吗?
以下是我最终得到的"厄运金字塔",例如:
( users: [ JSONValue ]? ) in
if let jsonValue: JSONValue = users?[ 0 ]
{
if let json: Dictionary< String, JSONValue > = jsonValue.object
{
if let userIDValue: JSONValue = json[ "id" ]
{
let userID: String = String( Int( userIDValue.double! ) )
println( userID )
}
}
}
Run Code Online (Sandbox Code Playgroud)
后记
Airspeed Velocity的答案是正确的答案,但是你需要使用Swift 1.2来使用逗号分隔的多个let,因为他建议,目前只在测试版的XCode 6.3中运行.
采取这个基本功能:
func sampleFunction ()
{
print( self )
}
Run Code Online (Sandbox Code Playgroud)
这里self指的是包含它的类实例,而不是 - 可能可以说更有意义 - 包含它的函数.
如何获得对包络函数的引用而不是它的包络类实例?
理想情况下,我希望做这样的事情:
func sampleFunction ( value: Int )
{
print( selfAsEnvelopingSampleFunction, value )
}
Run Code Online (Sandbox Code Playgroud) 我从https://makeappicon.com下载了23个iOS应用程序图标集,它们具有以下文件名:
Icon-App-20x20@1x.png
Icon-App-20x20@2x.png
Icon-App-20x20@3x.png
Icon-App-29x29@1x.png
Icon-App-29x29@2x.png
Icon-App-29x29@3x.png
Icon-App-40x40@1x.png
Icon-App-40x40@2x.png
Icon-App-40x40@3x.png
Icon-App-57x57@1x.png
Icon-App-57x57@2x.png
Icon-App-60x60@1x.png
Icon-App-60x60@2x.png
Icon-App-60x60@3x.png
Icon-App-72x72@1x.png
Icon-App-72x72@2x.png
Icon-App-76x76@1x.png
Icon-App-76x76@2x.png
Icon-App-76x76@3x.png
Icon-App-83.5x83.5@2x.png
Icon-Small-50x50@1x.png
Icon-Small-50x50@2x.png
ItunesArtwork@2x.png
Run Code Online (Sandbox Code Playgroud)
将它们拖放到Xcode > New Project > Single View App > Assets.xcassets > AppIcon窗口上时,将发生以下构建警告:
应用程序图标集“ AppIcon”有23个未分配的子级。
这就是我以前创建应用程序图标的方式,但是显然出了点问题,而且我找不到任何有用的文档或StackOverflow问题或解答。我需要怎么做才能使Xcode接受这些png作为应用程序图标?
感谢您的阅读。
考虑以下:
protocol SomeProtocol: Equatable {}
// then, elsewhere...
var someValue: Any?
func setSomething<T>(_ value: T) where T: SomeProtocol {
someValue = value
}
func getSomething<T>() -> T? where T: SomeProtocol {
return someValue as? T
}
Run Code Online (Sandbox Code Playgroud)
这些函数工作正常,但本质上就像计算属性一样。有什么方法可以实现以下内容吗?
var something<T>: T where T: SomeProtocol {
get { return someValue as? T }
set { someValue = newValue }
}
Run Code Online (Sandbox Code Playgroud)
感谢您的阅读。如果这个问题已经在其他地方被问过,我很抱歉,我已经搜索过,但有时我的搜索功能很弱。
这个问题是针对对Swinject for Swift有丰富经验的人。
我将展示有问题的代码,我的问题在底部。
代码有点多,抱歉。
这是MySwinjectStoryboard.swift注册:
import Swinject
extension SwinjectStoryboard
{
class func setup ()
{
defaultContainer.register( Stopwatch.self )
{
responder in Stopwatch(
signals: responder.resolve( SignalsService.self )!
)
}
defaultContainer.register( SignalsService.self )
{
_ in SignalsService()
}.inObjectScope( .Container )
defaultContainer.register( ImageService.self )
{
responder in ImageService(
signals: responder.resolve( SignalsService.self )!
, stopwatch: responder.resolve( Stopwatch.self )!
)
}.inObjectScope( .Container )
defaultContainer.registerForStoryboard( StartUpViewController.self )
{
resolvable, viewController in
viewController.stopwatch = resolvable.resolve( Stopwatch.self )!
viewController.image = resolvable.resolve( ImageService.self )!
}
} …Run Code Online (Sandbox Code Playgroud)